15

我有两个具有多对一关系的类 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;
 } 
}
4

2 回答 2

12

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

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

8.4. 组件作为复合标识符

...

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

但是在实践中情况可能会有所不同(请参阅HHH-2060和/或此线程以了解使用 CompositeUserType 和 IdentifierGenerator 的替代方案)。

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

2.2.3.2.4。部分标识符生成

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

...

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

(也请阅读 Hibernate 团队关于使用此功能的警告)。

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

参考

于 2010-11-08T05:50:08.570 回答
0

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

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

于 2013-03-18T14:33:29.943 回答