2017-06-07 12 views
0

私はJPAを使用しており、One-To-Many Realtionshipの仕組みを理解するのが困難です。私が欲しい一対多 - オブジェクトに正しくリンクする方法

// load System 
    EntityManager entityManager1 = entityManagerFactory.createEntityManager(); 
    List<mySystem> systems = entityManager1.createQuery("from mySystem").getResultList(); 
    entityManager1.close(); 

@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; 
    } 

} 

と::今、私はロードされている私のデータベース内の既存のシステムを、

@Entity 
public class mySystem { 
    @Id 
    @GeneratedValue 
    @Column(name = "system_id") 
    protected int system_id; 
    @Column 
    public String name; 

    @ManyToOne(cascade=CascadeType.ALL) 
    private mySystem parent; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "system", fetch = FetchType.EAGER) 
    private List<myCheck> checks; 

    public mySystem() { 
     //subSystems = new ArrayList<mySystem>(); 
     checks = new ArrayList<myCheck>(); 
    } 

    public boolean linkCheck(myCheck hc) { 
     return checks.add(hc); 
    } 

    public boolean unlinkCheck(myCheck hc) { 
     return checks.remove(hc); 
    } 

    public List<myCheck> getlinkedChecks() { 
     return checks; 
    } 

    public myCheck getLinkCheck(int hcId) { 
     for (myCheck hc : checks) { 
      if (hc.getId() == hcId) 
       return hc; 
     } 
     return null; 
    } 

    public int getId() { 
     return system_id; 
    } 

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

    public String getName() { 
     return name; 
    } 

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


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

} 

持っている私は、次の2つのクラスをしている

2つの新しいチェックをシステムに追加します。

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(); 

第2の解決策は、小切手が保存されますが、私はシステムとそれらをリンクしません。

誰かに説明がありますか?私は本当にこれを理解したい。

答えて

0

あなたには双方向の関係があります。これは、関係の各側がもう一方の側への参照を持つことを意味します。

ので、あなたの永続ロジックにまた、あなたの小切手

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

にシステムを注入する必要があります。しかし、あなたの(systems.get(0))に接続されていない場合、この場合には、あなたが問題を持っていますチェックを永続化するときにデタッチされたオブジェクトへの参照を持つため、永続コンテキストを使用するため、チェッククラス内のシステムにカスケードを配置するか、システムを永続させるか、チェックをカスケードしてチェックを持続させます。

関連する問題