Hibernate ManyToMany是否可以为非键列自连接? 获取mappingException

我有以下问题。 我有一个与其他用户实体有多对多关系的用户实体。 因此,我希望通过多种注释进行自我连接。 此关系基于整个系统中使用的现有表,因此我根本无法更改DB。 所以我们有2个表User(Id,ShortName)和UserLink(ParentId,ChildId)。

ID的注释分配给ShortName,但User和UserLink中的实际键是来自UserLink的ID和来自UserLink的ParentId和ChildId。

我试图从User实体处理以下方式:

@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 children; 

由于User实体中的键位于ShortName字段上,因此我必须将“Id”指定为引用的列名称param。 如果我不这样做,它将ShortName作为键,不会获取任何数据。

当我尝试按照上面显示的方式执行此操作时,我得到以下exception:

 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.(EntityManagerFactoryImpl.java:84) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904) ... 81 more 

你知道如何解决这个问题吗? 一个想法是我可以更改实体中的@Id并将其移动到用于连接的Id属性,但是这需要花费很多精力来重写坏的现有代码。

无论如何,是否有可能在不是键的列上进行多次自我连接?

干杯亚当