【问题标题】:JPA With composite key non standardJPA 带复合键非标准
【发布时间】:2021-02-16 13:51:33
【问题描述】:

我正在尝试为现有数据库进行 JPA 映射。我无法真正改变现有的结构。

我设法让它工作,但 Intellij 告诉我,即使它工作,某些列也不存在。所以我不知道是否有更好的方法可以做到这一点,还是 Intellij 不支持所有用例。

我为这个问题简化了我的映射和表格。 具有主复合键的 2 个表是:

Table_A
some_id_a
some_seq_a

Table B
some_id_a
some_seq_a
some_seq_b

而我的映射是:

@Data
@Entity(name="Table_A")
public class TableA {
  @EmbeddedId
  private Key key;

  @OneToMany
  @JoinColumn(name = "someIdA")
  @JoinColumn(name = "someSeqA")
  private List<TableB> tableBs;

  @Data
  @Embeddable
  public static final class Key implements Serializable {
    private String someIdA;
    private long someSeqA;
  }
}

@Data
@Entity(name="Table_B")
public class TableB {
  @EmbeddedId
  private Key key;

  @Data
  @Embeddable
  public static final class Key implements Serializable {
    private String someIdA;
    private long someSeqA;
    private long someSeqB;
  }
}

就像我说的那样,它可以工作,但我在 Intellij 中有一个错误,说 @JoinColumn(name ="someIdA") @JoinColumn(name = "someSeqA") 不存在并且期待像 @JoinColumn(name ="some_id_a") @JoinColumn(name = "some_seq_a") 这样的东西。

按照 Intellij 告诉我的方式使用它,JPA 出现错误提示:表 [table_b] 包含由多个逻辑列名引用的物理列名 [some_id_a]:[some_id_a]、[someIdA]。

尽管有 Intellij,但我的映射还可以,但有更好的选择吗?

谢谢

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    您可以使用“派生标识”并像这样映射您的类:

    @Data
    @Entity(name="Table_A")
    public class TableA {
      @EmbeddedId
      private Key key;
    
      @OneToMany(mappedBy = "tableA")
      private List<TableB> tableBs;
    
      @Data
      @Embeddable
      public static final class Key implements Serializable {
        private String someIdA;
        private long someSeqA;
      }
    }
    
    
    @Data
    @Entity(name="Table_B")
    public class TableB {
      @EmbeddedId
      private Key key;
    
      @MapsId("tableAKey") // maps tableAKey attribute of embedded id
      @JoinColumns({
        @JoinColumn(name="some_id_a", referencedColumnName="some_id_a"),
        @JoinColumn(name="some_seq_a", referencedColumnName="some_seq_a")
      })
      @ManyToOne
      private TableA tableA;
    
      @Data
      @Embeddable
      public static final class Key implements Serializable {
        private TableA.Key tableAKey; // corresponds to PK type of TableA
        private long someSeqB;
      }
    }
    

    在第 2.4.1 节的JPA 2.2 spec 中讨论了派生的身份(带有示例)。

    【讨论】:

    • 这就是我想要的,谢谢。在@JoinColumn 中,我只使用了 name 属性而不是 referenceColumnName,因为它犯了同样的错误,但是没有它,它仍然会生成正确的查询,所以它是完美的。
    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2014-05-28
    • 2011-09-21
    相关资源
    最近更新 更多