如何正确地在Hibernate中创建相同实体之间的关系?

时间:2018-12-12 13:22:40

标签: sql hibernate many-to-many one-to-one

我有以下用户实体,其中包含朋友列表,即相同实体的列表。

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private String surname;
    List<User> friends;
}

在Hibernate中映射此关系的正确方法是什么? 在本机SQL表中,可以通过创建定义关系beetwen用户的第二个表来解决。

2 个答案:

答案 0 :(得分:1)

在这里您可以使用以下示例:

@Entity
@Table(name = "users")
class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private String surname;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "user_friends")
    Set<User> friends;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public Set<User> getFriends() {
        return friends;
    }

    public void setFriends(Set<User> friends) {
        this.friends = friends;
    }

    public void addFriend(User u) {
        if (this.friends == null) {
            this.friends = new HashSet();
        }
        this.friends.add(u);
    }
}

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
   http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="deneme" transaction-type="RESOURCE_LOCAL">

        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <class>com.deneme.User</class>

        <properties>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://127.0.0.1;databaseName=springbootdb"/>
            <property name="javax.persistence.jdbc.user" value="emre"/>
            <property name="javax.persistence.jdbc.password" value="asdf_1234"/>
            <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
            <property name="hibernate.ddl-generation" value="auto"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
            <property name="hibernate.show_sql" value="true"/>

        </properties>

    </persistence-unit>
</persistence>

主要:

public class Main {
    public static void main(String[] args) {
        EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "deneme");
        EntityManager entitymanager = emfactory.createEntityManager();
        entitymanager.getTransaction().begin();

        User u = new User();
        u.setName("test");
        u.setSurname("test");

        User uf = new User();
        uf.setName("fri");
        uf.setSurname("fri");

        u.addFriend(uf);

        entitymanager.persist(u);   

        entitymanager.getTransaction().commit();

        entitymanager.close();
        emfactory.close();
    }
}

生成的sql:

Hibernate: insert into users (name, surname) values (?, ?)
Hibernate: insert into users (name, surname) values (?, ?)
Hibernate: insert into user_friends (User_id, friends_id) values (?, ?)

数据库截图:

enter image description here

答案 1 :(得分:0)

您必须添加适当的@OneToMany@ManyToOne注释。您必须引入一个新字段作为父字段。

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private String surname;

    @ManyToOne
    private User parentUser;

    @OneToMany(mappedBy = "parentUser")
    List<User> friends;
}