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

我有两个类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; @OneToMany(mappedBy="documentVersion", targetEntity=DocumentLog.class, cascade ={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) public List getDocumentLog() { return documentLog; } public void setDocumentLog(List 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; } } 

文档在这个主题上有点混乱……

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

8.4。 组件作为复合标识符

您不能使用IdentifierGenerator生成复合键。 相反,应用程序必须分配自己的标识符。

但实际情况可能略有不同(请参阅HHH-2060和/或此线程以获取使用CompositeUserType和IdentifierGenerator的替代方案)。

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

2.2.3.2.4。 部分标识符生成

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

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

(另请阅读Hibernate团队针对使用此function的警告)。

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

参考

  • Hibernate核心参考指南
    • 8.4。 组件作为复合标识符
  • Hibernate Annotations 3.5参考指南
    • 2.2.3.2.4。 部分标识符生成

可以为@EmbeddedId声明自己的生成器以使用序列进行Id生成。

此外,您需要声明假实体以自动创建序列。