【问题标题】:Hibernate: Mapping User-Friends relation in Social NetworksHibernate:映射社交网络中的用户-朋友关系
【发布时间】:2010-09-28 15:00:02
【问题描述】:

我试图找出这个问题已经有一段时间了,并且通过谷歌搜索很多人都有类似的问题。

我正在尝试使用 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,因为没有明确区分friend 和 befriended。到目前为止一切顺利,我得到了错误,但我该怎么做?

有什么想法吗?我的智慧已经到了尽头。

【问题讨论】:

    标签: java hibernate annotations hibernate-mapping


    【解决方案1】:

    Many to Many 的事实是它需要更多的配置,因为 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】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这当然是一个很好的解决方案,但我还没有完全卖掉。基本上为了得到朋友,我不得不合并两个集合,这很不令人满意。

        绝对没有办法在hibernate中创建幂等、自反关系吗?

        【讨论】:

          【解决方案5】:

          我今天也遇到了同样的问题。

          @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
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-13
            • 1970-01-01
            • 2020-08-07
            相关资源
            最近更新 更多