如何在Hibernate中将一对多关联添加到嵌入式类型?

时间:2012-06-24 12:06:05

标签: java hibernate one-to-many

我有一个包含组件最后一个实例的实体:

@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关联。

这对我有用吗?如果没有,我的替代方案是什么?如果是,那将如何影响二级缓存,并且更新嵌入式实例是否存在限制(我可以使用不可变对象)?

2 个答案:

答案 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
  • HistoricalServiceCall实体。

客户应包含嵌入式ServiceCall字段(最后一次服务调用)。

如果您希望OneToMany是双向的,则HistoricalServiceCall实体应具有ID,嵌入式ServiceCall字段(HistoricalServiceCall的数据),以及可能与Customer的ManyToOne关联。

客户应与HistoricalServiceCall建立OneToMany关联。