JPA-在JoinTable上映射ManyToOne实体/子类,该表也被同一InheritanceGroup的另一个ManyToMany实体/子类映射

时间:2019-05-28 06:42:35

标签: java hibernate jpa

出于学习目的,我正在尝试在旧的JDBC CRUD程序上实现 JPA / Hibernate5.X 。这意味着我还是JPA / Hibernate的年轻朋友。

我有2个父实体:艺术家-发布

发布有2个子类。 相册编译

  • 相册仅由 1 位艺术家( ManyToOne )组成。

  • 编译许多艺术家( ManyToMany )组成。

要使多对多工作,我们需要第三个 JoinTable(art_alb),其中两个父实体的PK作为列,并且此表应具有 Composite PrimaryKey ( artist_id,album_id)或至少不应该有任何PK,因为我们将在JoinTable中多次看到相同的artist_id或album_id。

问题

我当前在Compilation.java上的映射达到上述条件。但是,当我尝试将专辑子类映射到 art_alb 表上的Join时,就会出现问题。

除了一个关键错误外,我的Album.java映射似乎也可以正常工作,它们在我们的JoinTable(art_alb)中创建了一个单列PK,因此我们得到了ConstraintViolationException。

java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '67e7ab93-0218-410a-9f4c-610a97237d32' for key 'PRIMARY'

enter image description here

超类发布:

    @Entity
    @Table(name="album") //Dont Let the name confuse you, just MySQL doesnt like Release as a TableName.
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="altype",discriminatorType=DiscriminatorType.STRING)
    public abstract class Release implements Serializable {
          @Id
          @Column(name = "albid", unique = true, nullable = false)
          private String id;
    //Extra_fields + Getter/Setters

子类编译:

@Entity
@DiscriminatorValue("Compilation")
public class Compilation extends Release {

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "alb_art", 
    joinColumns = {
            @JoinColumn(name = "albid", nullable = false, updatable = false) }, 
    inverseJoinColumns = {
            @JoinColumn(name = "arid", nullable = false, updatable = false) },
    uniqueConstraints = {
            @UniqueConstraint( columnNames = {"albid", "arid"})})
    private List<Artist> artists;

子类别相册:

 @Entity  
 @DiscriminatorValue("Album")
 public class Album extends Release  { //implements Serializable
        @ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
        @JoinTable(name = "alb_art", 
        joinColumns = { 
             @JoinColumn(name = "albid", nullable = false, updatable = false)},
        inverseJoinColumns = { 
             @JoinColumn(name = "arid", nullable = false, updatable = false) })
      private Artist art;

TLDR

因此,总结来说,我想要的基本上是将ManyToOne关系映射到JoinTable(而不是目标实体的JoinColumn)无需休眠以创建单个连接表上的-UniqueConstraint列。

范围外问题: 由于Artist.java没有任何Release rel;Collection<Release>;字段,这意味着我与Artist-Release的关系是单向的吗? (如果我错了,请纠正我)。

感谢您的时间和考虑!

0 个答案:

没有答案