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中

您需要的是以下内容:

  • 客户实体
  • 可嵌入的服务调用
  • 历史服务调用实体
客户应包含嵌入式ServiceCall字段(最后一次服务调用)

HistoricalServiceCall实体应该有一个ID、一个嵌入式ServiceCall字段(HistoricalServiceCall的数据),如果希望OneToMany是双向的,还可能有一个与客户的多通关联


客户应该与HistoricalServiceCall有一个OneToMany关联。

您可以发布您试图建模的表结构吗。客户:ID、版本、创建日期等+ServiceCallDate、ServiceCallStatus。我想要另一张桌子,ServiceCall:ID、日期、状态等,谢谢。我已经更新了我的问题-我需要客户上的ServiceCall字段,没有其他连接。您是否建议复制ServiceCall字段-一个副本在嵌入式实例中,另一个副本在历史表中?我已经更新了答案,如果你觉得答案有用,请不要忘记投票。我不认为按照我的建议,将OneToMany从ServiceCall添加到HistoricalServiceCall,而不是从Customer添加到HistoricalServiceCall有什么意义。此外,这禁止重用可嵌入到HistoricalServiceCall中的ServiceCall。使用ams的答案,您必须复制HistoricalServiceCall类中ServiceCall的所有字段和方法。我仍然需要查看
ServiceCall
与其
History
实体之间的正确关系即使将关联放在ServiceCall中,关联仍将在客户和HistoricalServiceCall之间。嵌入对象只是用来将一些字段组合在一起,但它不能成为关联的目标。是的,我理解这一点。我将做一个懒惰的一对多,或者仅仅从
历史
方面对关系建模。仍然待定。