通过组合主键的一部分将Hibernate实体与英国一起加入

时间:2019-07-17 15:26:24

标签: java hibernate jpa foreign-keys hibernate-annotations

我正在使用Hibernate 4.3,并试图在无法更改的旧数据库实体之间建立关系模型。

我试图映射表B和表A之间的多对一关系。表A具有由3列组成的复合主键。这些列之一是其自身的唯一键(并具有唯一的约束)。表B还具有一个复合主键。表B的组合PK的一个字段是使用该唯一值的表A的FK。不管我如何尝试映射这种关系,我通常都会收到Hibernate的错误消息。

为简洁起见,以下是与该问题无关的字段:

@Embeddable
class APk {
   private int site;
   private int client;
   private int id;

  @Column(name = "site", nullable = false)
  public int getSite() { return this.site; }

  @Column(name = "client", nullable = false)
  public int getClient() { return this.client; } 

  @Id
  @Column(name = "id", nullable = false)
  public int getId() { return this.id; }
}

@Entity
@Table(name = "A", uniqueConstraints = { @UniqueConstraint(columnNames = "id") })
class A {
  private APk id;
  private String otherStuff;

  @EmbeddedId
  public APk getAPk() { return this.id; }
}

@Embeddable
class BPk {
   private String value;
   private int aId;

   @Column(name = "VALUE", nullable = false)
   public String getValue() { return this.value; }

   @Column(name = "A_ID", nullable = false)
   public int getAId() { return this.aId; }
}

@Entity
@Table(name = "B")
class B {
  private BPk id;
  private String moreFields;
  private A entityA;

  @EmbeddedId
  public BPk getId() { return this.id; }

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "a_id", referencedColumnName = "id", insertable = false, updatable = false)
  public A getEntityA() { return this.entityA; }
}

我尝试将@JoinColumn与该单个字段一起使用,但收到以下两条错误消息之一:

  1. 在上面的代码中,错误是
      

    referencedColumnNames(ID) of B referencing A not mapped to a single property

  2. 如果我删除referencedColumnName属性并添加@MapsId("id")批注,则会收到错误消息:
      

    org.hibernate.AnnotationException: A Foreign key refering A from B has the wrong number of column. should be 3

一些注意事项:

  • 只需要B就能加载A,就不需要反向,因为它永远不会被使用。但这似乎并没有简化映射。
  • @MapsId注释中删除referencedColumnName属性时,我认为我没有正确使用@JoinColumn注释
  • 尽管底层数据库可能并不重要,但不幸的是Oracle 11g
  • 我在SO上也看到了其他类似的问题,我们试图引用部分组合键,但是他们都不能够回答这个问题,因为他们在数据库中都有可用的列来更新其模型。 ,或者复合PK在其中一列上没有唯一约束。

在Hibernate(4)中有没有办法解决这个问题?这种非标准关系是否需要@JoinFormula

编辑:我尝试了其他一些尝试,但没有成功:

  • @Embeddable/@EmbeddedId注释替换@IdClass注释
  • 使用@JoinColumnsOrFormulas注释和两个“缺失”字段的公式,这两个实体在实体B中不可用,但属于实体A的PK。

0 个答案:

没有答案