Java 如何在Hibernate中将一对多关联添加到嵌入式类型?
我有一个实体,它保存组件的最后一个实例:Java 如何在Hibernate中将一对多关联添加到嵌入式类型?,java,hibernate,one-to-many,Java,Hibernate,One To Many,我有一个实体,它保存组件的最后一个实例: @Entity public class Customer { ... @Embedded public ServiceCall getLastServiceCall() {...} ... } @Embeddable public class ServiceCall() { public Date getDate(); public Status getStatus(); } 嵌入ServiceCall是为了调用custom
@Entity
public class Customer {
...
@Embedded
public ServiceCall getLastServiceCall() {...}
...
}
@Embeddable
public class ServiceCall() {
public Date getDate();
public Status getStatus();
}
嵌入ServiceCall
是为了调用customer.getLastServiceCall().getDate()
,而不需要另一个表联接
我希望将该关联设为一对多,并开始保存所有ServiceCall
s,同时将一个嵌入到客户中
Hibernate(我使用的是v3.6)声明:
您还可以在可嵌入对象(即@OneToOne、@ManyToOne、@OneToMany或@ManyToMany)中使用关联注释。要覆盖关联列,可以使用@AssociationOverride
似乎我所要做的就是将@OneToMany
添加到LastServiceCall
关联中
那对我有用吗?如果没有,我的选择是什么?如果是,这将如何影响二级缓存,以及更新该嵌入式实例是否有限制(我可以使用不可变对象)?@嵌入式类型在数据库中不应该有自己的标识,因此我认为您不能在ServiceCall中将@OneToMany添加到Customer类中
@OneToMany
@Embedded
public ServiceCall getLastServiceCall() {...}
但是,您可以像这样向@Embedded Service call元素添加关联
@Entity
pubic class HistoricalServiceCall extends ServiceCall
{
@Id
private String id;
}
@Embeddable
public class ServiceCall {
@OneToMany(fetch=FetchType.LAZY)
@JoinColumn(name="join_column_defined_on_customer_table")
List<HistoricalServiceCall> getServiceCallHistory();
}
@实体
公共类HistoricalServiceCall扩展了ServiceCall
{
@身份证
私有字符串id;
}
@可嵌入
公共类服务呼叫{
@OneToMany(fetch=FetchType.LAZY)
@JoinColumn(name=“join\u column\u defined\u on\u customer\u table”)
列出getServiceCallHistory();
}
更新:将FetchType.LAZY放在getServiceCallHistory()上是一种提示,提示JPA提供程序在调用getServiceCallHistory之前先等待,然后再进行另一次选择以拉入该关联
因此,在我描述的设置中,如果执行customer.getLastServiceCall().getDate()调用,它将不会拉
在关系为惰性之前的ServiceCallHistory中 您需要的是以下内容:
- 客户实体
- 可嵌入的服务调用
- 历史服务调用实体
客户应该与HistoricalServiceCall有一个OneToMany关联。您可以发布您试图建模的表结构吗。客户:ID、版本、创建日期等+ServiceCallDate、ServiceCallStatus。我想要另一张桌子,ServiceCall:ID、日期、状态等,谢谢。我已经更新了我的问题-我需要客户上的ServiceCall字段,没有其他连接。您是否建议复制ServiceCall字段-一个副本在嵌入式实例中,另一个副本在历史表中?我已经更新了答案,如果你觉得答案有用,请不要忘记投票。我不认为按照我的建议,将OneToMany从ServiceCall添加到HistoricalServiceCall,而不是从Customer添加到HistoricalServiceCall有什么意义。此外,这禁止重用可嵌入到HistoricalServiceCall中的ServiceCall。使用ams的答案,您必须复制HistoricalServiceCall类中ServiceCall的所有字段和方法。我仍然需要查看
ServiceCall
与其History
实体之间的正确关系即使将关联放在ServiceCall中,关联仍将在客户和HistoricalServiceCall之间。嵌入对象只是用来将一些字段组合在一起,但它不能成为关联的目标。是的,我理解这一点。我将做一个懒惰的一对多,或者仅仅从历史
方面对关系建模。仍然待定。