我遇到以下问题。我有一个与其他用户实体具有多对多关系的用户实体。因此,我想使用多位注释进行自连接。这种关系基于整个系统使用的现有表,因此我根本无法对数据库进行更改。所以我们有 2 个表 User(Id, ShortName) 和 UserLink(ParentId, ChildId)。
ID 的注释被分配给 ShortName,但 User 和 UserLink 中的实际键都是 User 中的 ID 以及 UserLink 中的 ParentId 和 ChildId。
我试图从用户实体中通过以下方式处理这个问题:
@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;
由于 User 实体中的键位于 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 属性,但这需要花费大量精力来重写不良的现有代码。
无论如何,是否可以在不是键的列上进行多自连接?
干杯
亚当