У меня следующая проблема. У меня есть пользовательский объект, который имеет отношения «многие ко многим» с другими пользовательскими объектами. Следовательно, я хочу сделать самосоединение с аннотацией manytomany. Это отношение основано на уже существующей таблице, которая используется в системе, поэтому я вообще не могу вносить изменения в БД. Итак, у нас есть 2 таблицы User(Id, ShortName) и UserLink(ParentId, ChildId).
Аннотация ID назначается ShortName, но фактические ключи как в User, так и в UserLink — это ID из User и ParentId и ChildId из UserLink.
Я пытаюсь справиться с этим следующим образом из сущности пользователя:
@Id
@Column(name = "ShortName")
private String shortName;
@Column(name = "Id")
private long id;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "UserLink",
joinColumns = { @JoinColumn(name = "ParentId", referencedColumnName = "Id") },
inverseJoinColumns = { @JoinColumn(name = "ChildId", referencedColumnName = "Id") })
private Collection<UserEntity> children;
Поскольку ключ в сущности пользователя находится в поле ShortName, я должен указать «Id» в качестве параметра имени ссылочного столбца. Если я этого не сделаю, он примет ShortName в качестве ключа и не получит никаких данных.
Когда я пытаюсь сделать это так, как показано выше, я получаю следующее исключение:
Caused by: org.hibernate.MappingException: Duplicate property mapping of **_entity_UserEntity_children found in **.entity.UserEntity
at org.hibernate.mapping.PersistentClass.checkPropertyDuplication(PersistentClass.java:486)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:476)
at org.hibernate.mapping.RootClass.validate(RootClass.java:268)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1287)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1729)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:84)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
... 81 more
У вас есть идеи, как это можно исправить? Одна идея состоит в том, что я мог бы изменить @Id в сущности и переместить его в свойство Id, которое используется для соединений, но для этого потребуется много усилий, чтобы переписать плохой существующий код.
В любом случае, можно ли сделать многозначное самообъединение столбцов, не являющихся ключами?
Привет Адам