3

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

@Entity
public class Customer {
  ...
  @Embedded
  public ServiceCall getLastServiceCall() {...}
  ...
}

@Embeddable
public class ServiceCall() {
  public Date getDate();
  public Status getStatus();
}

嵌入是ServiceCall为了调用customer.getLastServiceCall().getDate()而不需要另一个表连接。

我想建立一对多的关联,并开始保存所有ServiceCalls,同时将一个嵌入客户中。

Hibernate 的文档(我正在使用的 v3.6)指出:

您还可以在可嵌入对象(即@OneToOne、@ManyToOne、@OneToMany 或@ManyToMany)中使用关联注释。要覆盖关联列,您可以使用@AssociationOverride。

看来我应该做的就是加入@OneToMany协会LastServiceCall

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

4

2 回答 2

4

@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 后再进行另一个选择以拉入该关联。

因此,使用我所描述的设置,如果您执行 customer.getLastServiceCall().getDate() 在关系变得懒惰之前它不会拉入 ServiceCallHistory。

于 2012-06-24T13:19:24.220 回答
1

您需要的是以下内容:

  • 客户实体
  • 可嵌入的 ServiceCall
  • 一个 HistoricalServiceCall 实体。

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

HistoricalServiceCall 实体应该有一个 ID、一个嵌入的 ServiceCall 字段(HistoricalServiceCall 的数据),如果您希望 OneToMany 是双向的,则可能还有一个与 Customer 的 ManyToOne 关联。

Customer 应该有一个与 HistoricalServiceCall 的 OneToMany 关联。

于 2012-06-24T18:53:53.340 回答