У меня есть две сущности, которые имеют отношение @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?