这有点长,但是一个简单的概念问题。请花一些时间阅读:)
我有两个表,它们的列完全相同,只是主键不同。所以我创建了一个具有公共列的@MappedSuperclass
,并使用@Entity
对子类进行了注解
@MappedSuperclass
public abstract class AbstractCorporateAction {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ticker_serial", nullable = false, insertable = false, updatable = false)
@ToString.Exclude
private Ticker ticker;
@Column(name = "corp_act_type", nullable = false, precision = 4)
private BigInteger corpActType;
@Column(name = "number_of_shares", precision = 20)
private BigInteger numberOfShares;
}
下面是子类:
@Entity
@Table(name = "corporate_actions", schema = "dfn_content_data")
public class ContentDataCorporateAction extends AbstractCorporateAction {
@Id
@Column(name = "action_id", precision = 10)
private BigInteger id;
}
@Entity
@Table(name = "corporate_actions", schema = "dfn_ms_history")
public class MsHistoryCorporateAction extends AbstractCorporateAction {
@Id
@Column(name = "id")
private BigInteger id;
@Column(name = "source_action_id", length = 20, unique = true)
private String sourceActionId;
}
你可以看到一个子类的主键是action_id
,而另一个只是id
。我的任务是从这两个子类中检索行,做一些计算,更新相应的字段并推回。
除了最后一部分推回到DB之外,我都做了。现在我有了一个数据列表:List<AbstractCorporateAction>
,我想推回去。
1.我尝试通过扩展extends JpaRepository<AbstractCorporateAction, BigInteger>
来创建DAO。但是失败了,因为AbstractCorporateAction
中没有@Id
属性
org.springframework.beans.factory.BeanCreationException:创建在www.example.com _adjustments.repository.calculation中定义的名为“abstractCorporateActionDao”的Bean时出错。com.gtn.ca在CalculationPersistenceConfiguration上声明的@EnableJpaRepositories中定义的abstractCorporateActionDao:调用init方法失败;嵌套的异常是java.lang.IllegalArgumentException:此类[类com.gtn.ca_adjustments.实体.计算.抽象公司操作]未定义标识类
1.然后我尝试将其转换为继承表
@实体@继承(策略= InheritanceType.TABLE_PER_CLASS)公共抽象类AbstractCorporateAction { }
再次失败,因为没有公用ID。
我现在能做什么?
我试过:
interface ContentDataCorporateActionDao extends JpaRepository<ContentDataCorporateAction, BigInteger> {
}
interface MsHistoryCorporateActionDao extends JpaRepository<MsHistoryCorporateAction, BigInteger> {
}
@Repository
public class AbstractCorporateActionDao {
// Autowire both
private final ContentDataCorporateActionDao contentDataCorporateActionDao;
private final MsHistoryCorporateActionDao msHistoryCorporateActionDao;
@Transactional
public void saveAll(List<AbstractCorporateAction> abstractCorporateActions) {
// 1. filter all actions belong to first child class into a list
// 2. filter all actions belong to second child class into another list
// 3. for each list -> saveALl() to corresponding dao
}
}
这是唯一的方法吗?这似乎太多的任务。
1条答案
按热度按时间ukqbszuj1#
您可以通过以下方式对此进行简化:
因此,不需要创建中间列表。因为您的JPA实现将延迟更新,所以使用
saveAll
没有任何好处。