如何在多个嵌入类中使用字段可用的复合ID

时间:2014-02-27 16:03:43

标签: java hibernate jpa orm

我的表的复合键是userid,orderno,orderstatus。

实体类是

@Entity
public class OrTest implements java.io.Serializable {

  private UserInfo user;   //UserInfo is embedded class having userid
  private OrderInfo order; // OrderInfo is embedded class having order
  private Status  status;  //Status is embedded class having orderstatus
  //Contains other misc info

}

如何在此场景中使用embeddedid,其中我的实际复合键字段分布在多个嵌入类中。

2 个答案:

答案 0 :(得分:0)

您可以让EmbeddedId类包含所有3个键。如下所示

public class OrTextPk implements Serializable{
     @Column(name="userId")
     public String userId;
     @Column(name="orderNo")
     public String orderNo'
     @Column(name="orderStatus")
     public String orderStatus;
}

现在,在OrText类中,您可以执行以下操作。

@Entity
public class OrTest implements java.io.Serializable {

  @EmbeddedId
  private OrTextPk id;

  @OneToOne(fetch=FetchType.LAZY)
  @JoinColumn(name="userId")
  private UserInfo user;   //UserInfo is embedded class having userid
  .
  .
  . 
  so on...
}

答案 1 :(得分:0)

除了@Zeus发布的解决方案之外,您只需要按照以下方式进行较小的更改即可。

复合PK

public class OrTextPk implements Serializable{
 public String userId;
 @Column(name="orderNo")
 public String orderNo'
 @Column(name="orderStatus")
 public String orderStatus;
}

主要实体类

@Entity 
public class OrTest implements java.io.Serializable {
 @EmbeddedId
 private OrTextPk id;

 @OneToOne(fetch = FetchType.LAZY)
 // Note: it will help to map value of userId (UserInfo) to Pk object
 @MapsId("userId")  
 @JoinColumn(name = "userId")
 private UserInfo user;   //UserInfo is embedded class having userid
 .
      .
      .
 so on...
}

现在,在设置UserInfo(用户)的新建/持久对象时,userId对象的UserInfo的值将分配给userId的{​​{1}}同时保留OrTextPk对象。