问题可能是由于您两次映射了相同的双向关联。如果您对相同的联接表或联接列两次告诉Hibernate,则存在问题。在双向关联中,关联的一端必须映射该关联,而另一端必须使用
mappedBy属性告诉Hibernate这是另一端的逆。
由于多对多是完全对称的,因此请选择一端作为所有者(即,映射关联并因此具有
@JoinTable注释的一端)。另一侧只是反面,因此没有
@JoinTable注释,但具有
mappedBy属性。
例:
@Entity@Tablepublic class User extends BusinessObject { ... // This end is the owner of the association @ManyToMany @JoinTable(name= "user_role", joinColumns = {@JoinColumn(name="user_id")}, inverseJoinColumns = {@JoinColumn(name="role_id")}) private Set<Role> roles = new HashSet<Role>(); ... }@Entity@Tablepublic class Role extends BusinessObject { ... // This end is not the owner. It's the inverse of the User.roles association @ManyToMany(mappedBy = "roles") private Set<User> users = new HashSet<User>(); ... }补充笔记:
- targetEntity没什么用,因为Hibernate知道了它的得益于的通用类型
Set
。如果Set是一个Set<SomeInterface>
- CascadeType.ALL当然不是您想要的。删除用户时是否要删除用户的所有角色?具有这些角色的其他用户应该怎么办?
- 您几乎应该总是初始化双向关联的两端。Hibernate将所有者端(即没有
mappedBy
属性的端)考虑在内以保持关联。 - 所有这些都在Hibernate参考文档中进行了说明。阅读:它充满了有用的信息,并不难理解。



