【问题标题】:How can I use generated value within composite keys?如何在复合键中使用生成的值?
【发布时间】:2011-05-06 10:41:59
【问题描述】:

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

【问题讨论】:

    标签: java hibernate orm annotations composite-key


    【解决方案1】:

    关于这个主题的文档有点混乱......

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

    8.4. Components as composite identifiers

    ...

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

    但实际情况可能会有所不同(请参阅 HHH-2060 和/或 this thread 了解使用 CompositeUserType 和 IdentifierGenerator 的替代方案)。

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

    2.2.3.2.4. Partial identifier generation

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

    ...

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

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

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

    参考文献

    【讨论】:

    • 这个区域完全干净如泥。实际上,Hibernate 允许生成构成复合键的整​​个组件已经有一段时间了。但仅通过 hbm.xml 映射,我们从未通过注释公开它。 “部分标识符生成”的概念来自一个,哦,让我们说得好,并称其为 SpecJ 团队对 JPA 规范的“有趣”阅读。本质上,他们声称,由于规范不允许这样做,因此将@GeneratedValue 附加到一个或多个@Id 映射构成复合ID 是合法的。希望对您有所帮助。
    【解决方案2】:

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

    另外,您需要声明 fake entity 才能自动创建序列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 2019-03-18
      • 2017-08-05
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      相关资源
      最近更新 更多