Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何设计一个与自身有多对多关系的表?_Database_Hibernate_Jpa_Orm - Fatal编程技术网

Database 如何设计一个与自身有多对多关系的表?

Database 如何设计一个与自身有多对多关系的表?,database,hibernate,jpa,orm,Database,Hibernate,Jpa,Orm,例如,一个用户实体有一个friends属性,我如何设计这个friends属性,我认为有两种方法: friends属性是一个字符串,所有用户名都用“,”分隔,这样很难读取和修改 friends属性是一个类似于Set的集合,但这样我就不知道如何在实体中编写 有人知道最佳实践吗?这是Hay介绍的企业模型模式 一方代表一个人(或一个组织): 一方可以在一段时间内与另一方建立关系: PartyRelationship fromPartyId toPartyId fromDate toDate nullab

例如,一个用户实体有一个friends属性,我如何设计这个friends属性,我认为有两种方法:

  • friends属性是一个字符串,所有用户名都用“,”分隔,这样很难读取和修改
  • friends属性是一个类似于
    Set
    的集合,但这样我就不知道如何在实体中编写

  • 有人知道最佳实践吗?

    这是Hay介绍的企业模型模式

    一方代表一个人(或一个组织):

    一方可以在一段时间内与另一方建立关系:

    PartyRelationship
    fromPartyId
    toPartyId
    fromDate
    toDate nullable
    
    基本图表:

    Party -< PartyRelationship >- Party
    

    如果一个
    用户
    可以有多个朋友,您可以这样注释您的
    用户
    实体:

    @Entity
    public class User
    {
        @Id
        private Long id;
        private String name;
        @ManyToMany
        @JoinTable(
                name = "user_friends",
                joinColumns =
                { @JoinColumn(
                        name = "user_id") },
                inverseJoinColumns =
                { @JoinColumn(
                        name = "friend_id") })
        private Set<User> friends;
    }
    
    @实体
    公共类用户
    {
    @身份证
    私人长id;
    私有字符串名称;
    @许多
    @可接合(
    name=“user\u friends”,
    连接柱=
    {@JoinColumn(
    name=“user\u id”)},
    反向连接柱=
    {@JoinColumn(
    name=“friend\u id”)})
    私交朋友;
    }
    

    这样,将为
    用户
    创建一个表,并为
    用户
    之间的关系创建一个联接表。
    User
    表将有两列,“id”和“name”。
    user\u friend
    表将有两列,“user\u id”和“friend\u id”。
    user\u friend
    中的列都是
    user
    表的外键。

    我尝试并使用了与您相同的JPA注释,它可以工作。非常感谢。你认为这种自我关系以后还会出现其他问题吗?我假设友谊必须对两个用户都可见,所以你必须设置友谊的另一端。除了循环依赖之外,我看不到任何未来的问题。;-)啊,他们的友谊永远不会结束!
    insert into party values (1, 'Jerry');
    insert into party values (2, 'Neil');
    
    insert into partyRelationship values (1, 2, getDate(), null);
    
    @Entity
    public class User
    {
        @Id
        private Long id;
        private String name;
        @ManyToMany
        @JoinTable(
                name = "user_friends",
                joinColumns =
                { @JoinColumn(
                        name = "user_id") },
                inverseJoinColumns =
                { @JoinColumn(
                        name = "friend_id") })
        private Set<User> friends;
    }