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

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

@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;
 } 
}

答案 1

关于这个主题的文档有点令人困惑...

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

8.4. 作为复合标识符的组件

...

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

但在实践中情况可能略有不同(请参阅HHH-2060和/或此线程,了解使用CompositeUserType和标识符生成器的替代方法)。

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

2.2.3.2.4. 部分标识符生成

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

...

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

(另请阅读Hibernate团队的警告,不要使用此功能)。

不过,我没有任何实践经验。

引用


答案 2

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

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


推荐