Двунаправленная связь @ManyToMany с использованием @JoinTable с сущностью владельца, игнорирующей аргумент referencedColumnName - PullRequest
0 голосов
/ 03 октября 2019

У меня есть две сущности, которые имеют отношение @ManyToMany. Они выглядят следующим образом:

@Entity
@Table(name = "owner")
@Inheritance(strategy = InheritanceType.JOINED)
public class Owner implements Serializable {

    @Column(name = "id", updatable = false, nullable = false)
    private Integer id;

    @Id
    private String name;

    @ManyToMany(fetch = FetchType.EAGER,
        cascade = {CascadeType.PERSIST, CascadeType.MERGE}
    )
    @JoinTable(name = "owner_dog",
            joinColumns = @JoinColumn(name = "owner_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "dog_id", referencedColumnName = "id")
        )
    private Set<Dog> dogs = new HashSet<>();
}

@Entity
@Table(name = "dog")
public class Dog implements Serializable {

    @Id
    @Column(name = "id", updatable = false, nullable = false)
    private Integer id;

    private String name;

    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "dogs")
    private Set<Owner> owners= new HashSet<>();
}

Имя причины, помеченное как первичный ключ в сущности «Владелец», обусловлено устаревшими отношениями наследования, обозначенными аннотацией @Inheritance. Подклассы соединяются с базовым классом полем имени. Вот пример одного из этих объектов:

@Entity
@Table(name = "woman")
public class Woman extends Owner {

    private String height;
    private String age;
}

По какой-то причине аргумент referencedColumnName в первой аннотации @JoinColumn отношения @ManyToMany не вступает в силу. Кажется, по умолчанию используется первичный ключ для сущностей, который в настоящее время является полем имени.

Согласно документу Java Hibernate JPA 2.1 для аргумента referencedColumnName ( Javadoc ):

(Необязательно) Имя столбца, на который ссылается этот столбец внешнего ключа.

  • При использовании с сопоставлениями отношений сущностей, кроме случаев, описанных здесь, указанный столбец находится в таблицецелевой объект.
  • При использовании с однонаправленным отображением внешнего ключа OneToMany указанный столбец находится в таблице исходного объекта.
  • При использовании внутри аннотации JoinTable ссылочный ключстолбец находится в таблице сущностей объекта-владельца или обратного объекта, если соединение является частью определения обратного соединения.
  • При использовании в отображении CollectionTable указанный столбец находится в таблицеобъект, содержащий коллекцию.

По умолчанию (применяется, только если используется один столбец соединенияd): то же имя, что и столбец первичного ключа в указанной таблице.

В итоге я получаю исключение, подобное этому, потому что оно пытается сравнить целочисленный идентификатор из таблицы отношений и имени поляиз таблицы владельца.

Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = name_id_t

ПРИМЕЧАНИЕ: name_id_t - это пользовательский тип имени, определенный в postgres.

Есть ли способ использовать поле, отличное от того, которое аннотировано @Id дляДвунаправленные отношения ManyToMany JoinTable?

...