JPA - Отображение объекта / подкласса ManyToOne в JoinTable, который также отображается другим объектом / подклассом ManyToMany из той же группы InheritanceGroup - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь реализовать JPA / Hibernate5.X в старой программе JDBC CRUD для учебных целей. Это означает, что я все еще молодой падаван с JPA / Hibernate.

Я получил 2 родительских объекта: Исполнитель - Выпуск .

Выпуск получил 2 подкласса. Альбом и Компиляция

  • Альбом состоит только из 1 Исполнителя. ( ManyToOne ).

  • Компиляция состоит из Многие Художники. ( ManyToMany ).

Для работы «Много ко многим» нам нужен третий JoinTable (art_alb) с PK обоих родительских объектов в виде столбцов, и эта таблица должна иметь Composite PrimaryKey (artist_id, album_id) или, по крайней мере, на нем не должно быть PK, потому что мы будем видеть один и тот же artist_id или album_id несколько раз в JoinTable.

Проблема

Мои текущие сопоставления на Compilation.java соответствуют указанным выше критериям. Но проблема возникает, когда я пытаюсь сопоставить подкласс Album с Join в таблице art_alb .

Мое сопоставление Album.java, похоже, также работает, за исключением одной критической ошибки: они создают PK с одним столбцом в нашем JoinTable (art_alb), и поэтому мы получаем 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 в JoinTable.

Вопрос OutOfScope: Поскольку Artist.java не имеет поля Release rel; или Collection<Release>;, это означает, что мои отношения Artist-Release являются однонаправленными? (поправьте меня, если я ошибаюсь).

Спасибо за ваше время и внимание!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...