有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate:在社交网络中映射用户朋友关系

我花了很长时间试图解决这个问题,通过谷歌搜索,很多人都有类似的问题

我正在尝试使用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
}

现在的问题是,它告诉我,我错误地使用了很多,因为我没有明确区分朋友和被朋友。到目前为止还不错,我得到了错误,但是我怎么能做我想做的呢

有什么想法吗?我已经智穷到极点了


共 (5) 个答案

  1. # 1 楼答案

    这当然是个好办法,但我还没有完全被说服。基本上,为了得到朋友,我不得不合并这两个系列,这是非常不令人满意的

    难道绝对没有办法在hibernate中创建幂等的反身关系吗

  2. # 2 楼答案

    我今天也有同样的问题

    @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
    

    这将初始化该实体的朋友列表。但请注意,它不会初始化这些朋友中的任何朋友。这其实是件好事

  3. # 3 楼答案

    多对多的事实是,它需要多一点配置,因为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;
    }
    
    

    希望它能奏效()

    编辑:另外,对获取类型要非常小心。。。您可以输入一个脱离控制循环的用户,并获取所有数据库

  4. # 4 楼答案

    说得好,事实上我试过了。问题是,然后我收到了一个关于mappedBy属性设置在关系双方的投诉,这是正确的,但无效。 我想知道一个简单的@ManyToMany和一些聪明的自定义查询来获取朋友是否是一个解决方案: ManyToMany将生成一个包含user_idfriend_id,的联接表,但查询将匹配其中任何一个字段,并返回所有匹配friend_iduser_id的用户。 有什么想法吗

  5. # 5 楼答案

    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;
    }
    

    如果这不起作用,您可以始终引入一个单独的类来表示两个用户之间的关系,并让每个用户都拥有该类的实例集合