【问题标题】:What's the best way to model Friendship using Java Hibernate and JPA使用 Java Hibernate 和 JPA 建模友谊的最佳方法是什么
【发布时间】:2020-08-04 09:28:21
【问题描述】:

假设我有一个 Person 实体。

一个人可以与一个或多个其他人建立“友谊”关系。

我会用表格中的条目来建模

| Person Id 1 | Person Id 2 |

但是,从语义上讲,如果人 1 是人 2 的朋友

| Person Id 1 | Person Id 2 |

相当于说第 2 个人是第 1 个人的朋友

| Person Id 2 | Person Id 1 |

当然,Java 中有很多方法,在查询中,例如((person1=x AND person2=y) OR (person1=y AND person2=x)),我会确保这种等价性得到尊重。但是有什么更有效的方法可以在在数据库中 本身以及在后续的存储库、JPQL 查询等中进行建模。

总结;我希望能够检查第 1 个人是否是第 2 个人的朋友,而无需进行两次检查 - (第 1 个人与第 2 个人的朋友)(第 2 个人与第 1 个人的朋友)。习惯上,我只想说(是第 1 个人和第 2 个人的朋友)。

我想隐含地模拟 A 与 B 成为朋友然后 B 自动与 A 成为朋友的等价性。

【问题讨论】:

    标签: java hibernate orm


    【解决方案1】:
    • 以下人物实体类
        @Entity
        public class Person {
    
        //Id and properties
    
          @ManyToMany
          @JoinTable(name="friendship", 
                    joinColumns={@JoinColumn(name="person_id")}, 
                    inverseJoinColumns={@JoinColumn(name="friend_id")})
           private Set<Person> friends = new HashSet<Person>();
    
           // Getter and Setter methods
         }
    
    • 它将生成一个person 表和一个friendship 表。 person 表将只包含与Personfriendship 相关的信息,表将只有两列person_idfriend_id 以保持关系。

    【讨论】:

    • 我的想法完全一样,但不确定它是否适用于 self @ManyToMany 关系(没有足够的时间来准确地测试它)
    • 应该可以,但是@ManyToMany 不能是EAGER,否则会一直抓取
    • 谢谢。但这并不能解决我的主要问题要检查人 1 是否是人 2 的朋友,我仍然需要检查是否((人 1 是人 2 的朋友)或(人 2 和人 1 的朋友)。它没有'不要隐含地模拟 A 是 B 的朋友然后 B 自动成为 A 的朋友的等价性
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 2012-01-27
    • 2010-11-19
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2010-09-16
    相关资源
    最近更新 更多