如何在复合键中使用生成的值?

时间:2010-11-08 00:13:06

标签: java hibernate orm annotations composite-key

我有两个类documentlog和documentversion(主键:int doc_id和int docVersionID),具有多对一关系。我使用了一个名为CompundKey的复合键类来管理复合主键。我需要自动增加docversionID,但我无法做到这一点。在这方面你能帮我吗?

@Entity
@Table(name = "Documentversion", schema = "DocumentManagement")
public class DocumentVersion implements Serializable { 

 private CompoundKey id;
 private List<DocumentLog> documentLog;

 @OneToMany(mappedBy="documentVersion", targetEntity=DocumentLog.class,  
   cascade ={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
 public List<DocumentLog> getDocumentLog() {
  return documentLog;
 }
 public void setDocumentLog(List<DocumentLog> documentLog) {
  this.documentLog = documentLog;
 }

 @EmbeddedId 
 @AttributeOverride(name="doc_Id", column=@Column(name="doc_Id") )
 public CompoundKey getId() {
  return id;
 }
 public void setId(CompoundKey id) {
  this.id = id;
 } 
}

2 个答案:

答案 0 :(得分:12)

该主题的文档有点令人困惑......

据我所知,复合键总是必须由应用程序分配(即非生成),至少使用标准JPA而且还有Hibernate Core:

  

8.4. Components as composite identifiers

     

...

     

您无法使用IdentifierGenerator   生成复合键。代替   应用程序必须分配自己的   标识符

但实际情况可能略有不同(有关使用CompositeUserType和IdentifierGenerator的替代方法,请参阅HHH-2060和/或this thread。)

现在,最令人困惑的部分,来自Hibernate Annotations 3.5文档:

  

2.2.3.2.4. Partial identifier generation

     

Hibernate支持自动   生成一些标识符   属性。只需使用   一个或多个@GeneratedValue注释   几个id属性。

     

...

     

您还可以在@EmbeddedId课程中生成属性。

(请同时阅读Hibernate团队针对使用此功能的警告)。

虽然我没有任何实际经验。

参考

答案 1 :(得分:0)

可以为generator声明自己的@EmbeddedId以使用序列生成ID。

此外,您需要声明fake entity以自动创建序列。