我有一个包含组件最后一个实例的实体:
@Entity
public class Customer {
...
@Embedded
public ServiceCall getLastServiceCall() {...}
...
}
@Embeddable
public class ServiceCall() {
public Date getDate();
public Status getStatus();
}
嵌入了ServiceCall
,以便在不需要其他表加入的情况下调用customer.getLastServiceCall().getDate()
。
我希望将该关联设为一对多,并开始保存所有ServiceCall
,同时保留一个嵌入客户的内容。
Hibernate的Docs(v3.6,我正在使用)声明:
您还可以在可嵌入对象中使用关联注释(即@OneToOne,@ ManyToOne,@ OneToMany或@ManyToMany)。要覆盖关联列,可以使用@AssociationOverride。
似乎我应该做的就是将@OneToMany
添加到LastServiceCall
关联。
这对我有用吗?如果没有,我的替代方案是什么?如果是,那将如何影响二级缓存,并且更新嵌入式实例是否存在限制(我可以使用不可变对象)?
答案 0 :(得分:3)
@Embeded类型不应该在数据库中有自己的标识,所以我认为你不能将@OneToMany添加到ServiceCall上的Customer类。
@OneToMany
@Embedded
public ServiceCall getLastServiceCall() {...}
但是,您可以像这样添加@Embeded Service调用元素的关联。
@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();
}
更新:将FetchType.LAZY放在getServiceCallHistory()上是一个提示,让JPA提供程序等到你调用getServiceCallHistory然后再执行另一个select来引入该关联。
所以我正在描述如果你做customer.getLastServiceCall()。getDate()的设置它不会拉 在关系懒惰之前的ServiceCallHistory中。
答案 1 :(得分:1)
您需要的是以下内容:
客户应包含嵌入式ServiceCall字段(最后一次服务调用)。
如果您希望OneToMany是双向的,则HistoricalServiceCall实体应具有ID,嵌入式ServiceCall字段(HistoricalServiceCall的数据),以及可能与Customer的ManyToOne关联。
客户应与HistoricalServiceCall建立OneToMany关联。