jpa 嵌套的OneToManyMap,包含3个表

j8yoct9x  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(43)

我有3个表与下面的模式:
表1:KEY主键:KEY_ID
表2:KEY_VERSION:主键:KEY_ID(外键到KEY.KEY_ID)和VERSION
表3:KEY_VERSION_BLOCK:主键:KEY_IDVERSION(外键到KEY_VERSION.KEY_ID,KEY_VERSION.VERSION),BLOCK_TYPE
我正在尝试建立这种关系使用hibernate如下。

public class Key implements Serializable {
    @EmbeddedId
    private KeyId keyId;

    @OneToMany(mappedBy = "Key", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<KeyVersion> keyVersions;
.....
}
// Embedded ID is not required here as it has only one key column, I will replace it, please ignore for now
@Embeddable
public class KeyId implements Serializable {

    @Column(name = "KEY_ID", nullable = false)
    public Long keyId;

}
public class KeyVersion implements Serializable {

    @EmbeddedId
    private KeyVersionId versionId;

    @MapsId("KeyId")
    @JoinColumns({ @JoinColumn(name = "KEY_ID", referencedColumnName = "KEY_ID") })
    @ManyToOne
    public Key key;

  @OneToMany(mappedBy = "KeyVersion", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<KeyVersionBlock> keyVersionBlocks;

.....
}
@Embeddable
public class KeyVersionId implements Serializable {

    @ManyToOne
    private Key key;

    @Column(name = "VERSION")
    private Integer version;

.....
}
public class KeyVersionBlock implements Serializable {

    @EmbeddedId
    private KeyVersionBlockId keyVersionBlockId;

    @MapsId("keyVersionId")
    @JoinColumns({ @JoinColumn(name = "KEY_ID", referencedColumnName = "KEY_ID"),
        @JoinColumn(name = "VERSION", referencedColumnName = "VERSION") })
    @ManyToOne
    private KeyVersion keyVersion;

....
}
public class KeyVersionBlockId implements Serializable {

    @Column(name = "BLOCK_TYPE")
    private Long blockType;

    private KeyVersionId keyVersionId;

....
}

我得到低于错误
原因:org.hibernate.AnnotationException:referencedColumnNames引用com. akama.portal.dexp.kms.core.model.KeyVersionBlock.keyVersion的com. akama.portal.dexp. kms.core.model.KeyVersion的(KEY_ID,VERSION)未Map到org.hibernate.cfg.BinderHelper. WebResourceSyntheticPropertyReference中的单个属性(BinderHelper.java:203)~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:104)~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate. Boot 子.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1750)~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
请帮助我摆脱这个错误或以其他方式建立这种关系。
我也试着在KEY_VERSION表中添加下面的内容,但没有帮助:
@Column(name = "KEY_ID", nullable = false, updatable = false, insertable = false) private Long keyId;

kg7wmglp

kg7wmglp1#

JPA不允许在主键本身中存在关系。JPA 3.0第11.1.17节:
不支持在嵌入的id类中定义的关系Map。
派生ID允许你在ID中引用被引用类的键,所以你需要的是:

public class Key implements Serializable {
  @Id
  @Column(name = "KEY_ID", nullable = false)
  public Long keyId;

  @OneToMany(mappedBy = "Key", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
  private List<KeyVersion> keyVersions;
.....
}

public class KeyVersion implements Serializable {

  @EmbeddedId
  private KeyVersionId versionId;

  @MapsId("key")
  @JoinColumns({ @JoinColumn(name = "KEY_ID", referencedColumnName = "KEY_ID") })
  @ManyToOne
  public Key key;

  @OneToMany(mappedBy = "KeyVersion", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
  private List<KeyVersionBlock> keyVersionBlocks;

.....
}

@Embeddable
public class KeyVersionId implements Serializable {
  //named this way as this could be used as an ID class instead of embeddable
  private Long key;

  @Column(name = "VERSION")
  private Integer version;

.....
}

字符串
然后,您为KeyVersionBlock和KeyVersionBlockId所做的应该可以工作,因为尽管嵌套了嵌入式,但键对象中不再有任何关系。

相关问题