问题可能是由于您两次映射了相同的双向关联。如果您对相同的联接表或联接列两次告诉Hibernate,则存在问题。在双向关联中,关联的一端必须映射该关联,而另一端必须使用mappedBy
属性告诉Hibernate这是另一端的逆。
由于多对多是完全对称的,因此请选择一端作为所有者(即,映射关联并因此具有@JoinTable
注释的一端)。另一侧只是反面,因此没有@JoinTable
注释,但具有mappedBy
属性。
例:
@Entity
@Table
public 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
@Table
public 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>();
...
}
补充笔记: