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

Nic*_*ick 13 java orm annotations hibernate 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;
 } 
}
Run Code Online (Sandbox Code Playgroud)

Pas*_*ent 12

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

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

8.4.组件作为复合标识符

...

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

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

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

2.2.3.2.4.部分标识符生成

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

...

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

(还请阅读Hibernate团队针对使用此功能的警告).

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

参考

  • 这个区域完全清澈如泥.实际上,Hibernate已经允许生成整个组件构成复合键很长一段时间了; 但是只有通过hbm.xml映射,我们才会通过注释暴露出来."部分标识符生成"的概念来自a,哦,让我们很好,并称它为SpecJ团队对JPA规范的"有趣"读取.从本质上讲,他们声称因为规范不允许它,所以将`@GeneratedValue`附加到一个或多个构成复合id的`@ Id`映射是合法的.希望有所帮助. (6认同)