在复合键和 @ManyToOne JoinColumns 之间共享列

Posted

技术标签:

【中文标题】在复合键和 @ManyToOne JoinColumns 之间共享列【英文标题】:Share columns between composite key and @ManyToOne JoinColumns 【发布时间】:2013-07-02 22:02:14 【问题描述】:

我遇到了一个问题,我不知道是否可以仅通过使用 hibernate/jpa 注释来解决。问题是我有一个复合键,它与我的外键复合 id 具有相同的列,我想在表上共享同一列。例如:

@Entity
class Id 
  @Id
  @Column(name = "idPessoa")
  public Integer idShared;


@Embeddable
class APK 
  @ManyToOne
  @JoinColumn(name = "idShared")
  public Id idShared;
  public String nKey;


@Entity
class A 
  @EmbeddedId
  public APK id;


@Embeddable
class BPK 
  @ManyToOne
  @JoinColumn(name = "idShared")
  public Id idShared;
  public Integer nCode;


@Entity
class B 
  @EmbeddedId
  public BPK id;

  @ManyToOne
  @JoinColumns( @JoinColumn(name = "idShared", nullable = false, insertable = false, updatable = false), @JoinColumn(name = "nKey", nullable = false) )
  public A a;

问题是如何在 A 和 B 之间共享 idShared 列并在 @ManyToOne 中使用它作为外键?

我已经尝试在 @JoinColumns 中使用名为 idShared 的 @JoinColumn,但我收到一条错误消息,提示我需要使用 insert = false 和 update = false,我已经输入了 insertable = false 和 updateable = false,但后来我收到另一个错误,说我不能混合。

我找到了一个可能的解决方案:

@ManyToOne
@JoinColumnsOrFormulas(value = 
@JoinColumnOrFormula(formula = @JoinFormula(value = "idShared", referencedColumnName = "idShared")),
@JoinColumnOrFormula(column = @JoinColumn(name = "nKey", nullable = false)) )
public A a;

但它给了我错误:

Unable to find column with logical name  in table A

它必须找到的列的“名称”属性似乎是空白的。

需要帮助!

【问题讨论】:

你不能创建另一个像idshared 这样有你共享ID的类,然后把它加入到bpk和apk吗? 实际上在我当前的代码中idShared是另一个类的ForeignKey,apk和bpk都有这个idShared的外键,但问题是我看不到如何共享同一列当我想在 B 内对 A 进行 FK 时 我认为解决方案是使用 JoinFormula 的东西,但我找不到关于它如何工作的文档 【参考方案1】:

请查看Official Java EE 6 Tutorial about composite primary key。你可以使用@EmbeddedId@Embeddable和/或@IdClass注解。

例如

// File: APK.java ---------------------
@Embeddable
public class APK implements Serializable 
  public Integer idShared;
  public String nKey;


// File: A.java ---------------------    
@Entity
public class A 
  @EmbeddedId public APK id;

【讨论】:

以上是关于在复合键和 @ManyToOne JoinColumns 之间共享列的主要内容,如果未能解决你的问题,请参考以下文章

具有复合键的 JPA ManyToOne

Fetch Lazy 不适用于具有复合 PK 的 ManyToOne

在休眠 ORM 中使用一个强制外键和一个可选外键中的列

候选键和复合键有啥区别?

使用复合主键和注释映射 ManyToMany:

在复合键和外键之间创建关系