Возможно ли самосоединение Hibernate ManyToMany для неключевых столбцов? получение MappingException

У меня следующая проблема. У меня есть пользовательский объект, который имеет отношения «многие ко многим» с другими пользовательскими объектами. Следовательно, я хочу сделать самосоединение с аннотацией 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, которое используется для соединений, но для этого потребуется много усилий, чтобы переписать плохой существующий код.

В любом случае, можно ли сделать многозначное самообъединение столбцов, не являющихся ключами?

Привет Адам


person Adam Soliński    schedule 04.09.2014    source источник
comment
Вам может быть интересен этот вопрос: stackoverflow.com/questions/5818373/   -  person zbig    schedule 04.09.2014