Java 一对多-如何正确链接到对象?

Java 一对多-如何正确链接到对象?,java,hibernate,jpa,one-to-many,many-to-one,Java,Hibernate,Jpa,One To Many,Many To One,我正在使用JPA,在理解一对多关系是如何工作的方面有一些困难 我有以下两门课: @Entity public class myCheck { @Id @GeneratedValue(strategy=GenerationType.AUTO) protected int Check_id; @Column private String name; @ManyToOne private mySystem system; @Ove

我正在使用JPA,在理解一对多关系是如何工作的方面有一些困难

我有以下两门课:

@Entity
public class myCheck {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    protected int Check_id;

    @Column
    private String name;

    @ManyToOne
    private mySystem system;

    @Override
    public String toString() {
        return this.name;
    }

    public int getId() {
        return Check_id;
    }

    public String getName() {
        return this.name;
    }

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

    public mySystem getLinkSystem() {
        return system;
    }

    public void linkSystem(mySystem system) {
        this.system = system;
    }

}
以及:

但我不能这么做:

    EntityManager entityManager2 = entityManagerFactory.createEntityManager();
    entityManager2.getTransaction().begin();

    myCheck check = new myCheck();
    check.setName("Check 1");
    systems.get(0).linkCheck(check);
    entityManager2.persist(check);

    myCheck check2 = new myCheck();
    check2.setName("Check 2");
    systems.get(0).linkCheck(check);
    entityManager2.persist(check2);

    entityManager2.merge(systems.get(0));
    entityManager2.getTransaction().commit();
    entityManager2.close();
第二个解决方案将保存支票,但我不会将它们与系统链接


有人对此有解释吗?我真的很想理解这一点。

你有双向关系,这意味着关系的每一方都应该有对另一方的引用

因此,在持久性逻辑中,您还需要在支票中注入系统

myCheck check = new myCheck();
check.setName("Check 1");
check.linkSystem(systems.get(0);
systems.get(0).linkCheck(check);
entityManager2.persist(check);
但是在这种情况下,如果您的(systems.get(0))未连接到持久化上下文,则会出现问题,因为在持久化检查时,您将引用解除连接的对象,您可以将级联放在检查类内的系统上,或者改为持久化系统,它已经级联了检查,因此检查将被持久化

    EntityManager entityManager2 = entityManagerFactory.createEntityManager();
    entityManager2.getTransaction().begin();

    myCheck check = new myCheck();
    check.setName("Check 1");
    check.linkSystem(systems.get(0));
    entityManager2.persist(check);

    myCheck check2 = new myCheck();
    check2.setName("Check 2");
    check2.linkSystem(systems.get(0));
    entityManager2.persist(check2);

    entityManager2.merge(systems.get(0));
    entityManager2.getTransaction().commit();
    entityManager2.close();
    EntityManager entityManager2 = entityManagerFactory.createEntityManager();
    entityManager2.getTransaction().begin();

    myCheck check = new myCheck();
    check.setName("Check 1");
    systems.get(0).linkCheck(check);
    entityManager2.persist(check);

    myCheck check2 = new myCheck();
    check2.setName("Check 2");
    systems.get(0).linkCheck(check);
    entityManager2.persist(check2);

    entityManager2.merge(systems.get(0));
    entityManager2.getTransaction().commit();
    entityManager2.close();
myCheck check = new myCheck();
check.setName("Check 1");
check.linkSystem(systems.get(0);
systems.get(0).linkCheck(check);
entityManager2.persist(check);