这是很长一段时间,我试图弄清楚这个问题,并从谷歌上搜索周围很多人都有类似的问题。

我想在社交网络的用户模型,使用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_idfriend_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

这将初始化的朋友该实体的名单。被警告,虽然,它并没有从这些朋友初始化任何朋友。这是一件好事,其实。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top