使用Hibernate和注解实现自引用的多对多关系

16

我思考这个问题的时候,头脑开始感到疼痛,难道它就是这么简单吗:

@ManyToMany(mappedBy = "following", cascade = CascadeType.ALL)
private Set<User> followers = new HashSet<User>();

@ManyToMany(mappedBy = "followers", cascade = CascadeType.ALL)
private Set<User> following = new HashSet<User>();

@jenson-button-event 我是否必须指定链接器表,不能让 hibernate 自己选择吗? - NimChimpsky
你不一定需要其他列在中间,但是建议基于很少需要。下面是如何实现它的方法,请确保指定表和列http://www.dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html。 - jenson-button-event
@jenson-button-event,你不需要在两侧都映射。 - NimChimpsky
此外,在多对多关系中使用CascadeType.ALL是一种代码异味。 - István Békési
1个回答

15

类似这样:

@ManyToMany(mappedBy = "following", cascade = CascadeType.ALL)
@JoinTable(name="UserRel", 
                joinColumns={@JoinColumn(name="ParentId")}, 
                inverseJoinColumns={@JoinColumn(name="UserId")})
private Set<User> followers = new HashSet<User>();

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="UserRel", 
                joinColumns={@JoinColumn(name="UserId")}, 
                inverseJoinColumns={@JoinColumn(name="ParentId")})
private Set<User> following = new HashSet<User>();

8
谢谢,但我只是从一个声明中删除了"mappedBy",现在它可以工作了。你不能在两边都使用"mappedBy",所以你的示例不会起作用。 - NimChimpsky
2
好的,所以它按照惯例选择表和列名称...很棒。 - jenson-button-event
1
我认为在followers上的@JoinTable可能会出现错误,例如:“被标记为mappedBy的关联不得定义诸如@JoinTable或@JoinColumn之类的数据库映射”。 - Uyric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接