Java 一对多-如何正确链接到对象?
我正在使用JPA,在理解一对多关系是如何工作的方面有一些困难 我有以下两门课: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
@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);