休眠:在社交网络映射用户好友关系
-
29-08-2019 - |
题
这是很长一段时间,我试图弄清楚这个问题,并从谷歌上搜索周围很多人都有类似的问题。
我想在社交网络的用户模型,使用Hibernate,什么是更基本的社交网络,而不是一个映射关系的友谊? 系统中的每个用户应该有它的朋友列表,我想这可能是一个非常简单的任务(只使用一个多对多的关系,对吧?)。所以,我继续尝试以下操作:
@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
}
现在的问题是,它告诉我,我用多对多误将其朋友之间没有明显的区别,并结识。到目前为止好,我得到的错误,但我该怎么做我想要什么?
任何想法?我已经达到了我的智慧结束。
解决方案
约多对多事实是,它需要更多一点的结构,因为它的当务之急是休眠产生关系表。 尝试这样:
@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;
}
希望工程=)
编辑:另外,要非常小心取出类型...您可以输入一个用户获取外的控制回路,并得到所有的数据库。
其他提示
在ManyToMany
注释具有的mappedBy参数。我想类似
@ManyToMany(mappedBy = "friends")
可能工作。在任何情况下,请参见文档。
编辑:
看起来好像一个多对多的关系必须是从两端接近。目前你是从一端才能访问。也许你应该添加其他关系以及:
@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;
}
如果不工作,你总是可以推出表示两个用户之间的关系,一个单独的类,并让每个用户有这样的类的实例的集合。
好点,和实际上我试过了。问题是,我然后得到一个投诉有关的mappedBy属性正在上的关系,这是事实,但无效的两侧设置。
我想知道阉简单@ManyToMany
有一些聪明的自定义查询来获取的朋友可能是一个解决方案:
该ManyToMany
会产生与user_id
和friend_id,
但查询会匹配任何字段的连接表,返回的所有用户,其中那场比赛无论是friend_id
或者是user_id
。
任何想法?
这当然会是一个很好的修复,但我还没有完全售出。基本上得到了朋友,我不得不合并两个集合,这是相当不理想。
是否有绝对没有办法创造一个幂等,自反关系处于休眠?
我今天有同样的问题为好。
@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
这将初始化的朋友该实体的名单。被警告,虽然,它并没有从这些朋友初始化任何朋友。这是一件好事,其实。