我已经有一段时间试图弄清楚这个问题了,并且在谷歌上搜索许多人都有类似的问题。
我正在尝试使用Hibernate为社交网络中的用户建模,而对于社交网络来说,什么比映射友谊关系更基本? 系统中的每个用户都应该有一个朋友的列表,我认为这可能是一个非常容易的任务(只需使用ManyToMany关系,对吧?)。所以我继续尝试以下内容:
@Entity
@Table(name="users")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="userid")
protected Long id = null;
@ManyToMany
protected List<User> friends = null
}
现在的问题是它告诉我,由于朋友和朋友之间没有明确的区别,我错误地使用了ManyToMany。到目前为止这么好,我得到了错误,但我怎么能做我想做的事呢?
有什么想法吗?我已经达到了智慧的终点。
答案 0 :(得分:1)
ManyToMany
注释具有mappedBy参数。我想像是
@ManyToMany(mappedBy = "friends")
可能会奏效。无论如何,请参阅docs。
编辑:
似乎需要从两端访问多对多关系。目前只能从一端访问您的。也许你应该添加其他关系:
@Entity
@Table(name="users")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="userid")
protected Long id = null;
@ManyToMany
protected List<User> friends = null;
@ManyToMany(mappedBy = "friends")
protected List<User> befriended = null;
}
如果这不起作用,您总是可以引入一个表示两个用户之间关系的单独类,并让每个用户都拥有该类实例的集合。
答案 1 :(得分:1)
关于多对多的事实是它需要更多的配置,因为Hibernate必须生成关系表。 试试这个:
@Entity
@Table(name="users")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="userid")
protected Long id = null;
@ManyToMany
@JoinTable(name = "user_friends",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "friend_id"))
protected List friends = null;
@ManyToMany(mappedBy = "friends")
protected List befriended = null;
}
希望它有效=)
编辑:另外,要非常小心获取类型...您可以输入用户获取失控循环并获取所有数据库。
答案 2 :(得分:0)
好点,事实上我试过了。问题是我接到关于在关系两侧设置的mappedBy属性的抱怨,这是真的,但是无效。
我想知道一个简单的@ManyToMany
有一些聪明的自定义查询来获取朋友可能是一个解决方案:
ManyToMany
会生成一个包含user_id
和friend_id,
的联接表,但查询会匹配其中一个字段,并返回匹配friend_id
或{{匹配的所有用户1}}就是这样。
有什么想法吗?
答案 3 :(得分:0)
那当然是一个很好的解决方案,但我还没有完全卖掉。基本上,为了得到朋友,我必须合并这两个系列,这是非常不令人满意的。
绝对没有办法在hibernate中创建幂等的,反身的关系吗?
答案 4 :(得分:0)
我今天也有同样的问题。
@Entity
@Table(name="users")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="userid")
protected Long id = null;
@ManyToMany
protected List<User> friends = null
}
应该没问题,我使用了类似的结构。但是我得到了延迟加载异常,当将fetchType设置为EAGER时,我得到了关于行李递归初始化的抱怨。
我如何解决问题:在用于获取“用户”的查询中,执行以下操作:
from User as u left join fetch u.friends
这将初始化该实体的朋友列表。但请注意,它不会初始化这些朋友的任何朋友。实际上这是一件好事。