2017-02-22 17 views
1

から多対多の関係でオブジェクトのコレクションを取得できません:は、私が休止状態で次の階層を持つデータベース

@Entity 
@Table(name = "elements") 
@Inheritance(strategy=InheritanceType.JOINED) 

public abstract class Elements implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "idelement") 
    private Integer idElement; 

    @ManyToMany(cascade = CascadeType.PERSIST, mappedBy = "elementsCollection") 
    private Collection<ElementsGroups> elementsGroupsCollection; 

    . 
    . 
    More attributes, constructor and getter/setter 
    . 
    . 
} 

@Entity 
@Table(name = "valves") 
@PrimaryKeyJoinColumn(name="idelement") 
@XmlRootElement 
public class Valves extends Elements { 

    @Basic(optional = false) 
    @Column(name = "position") 
    private int position; 

    @Basic(optional = false) 
    @Column(name = "status") 
    private boolean status; 

    . 
    . 
    More attributes, constructor and getter/setter 
    . 
    . 
} 

@Entity 
@Table(name = "elementsgroups") 
@XmlRootElement 
public class ElementsGroups implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "idgroup") 
    private Integer idGroup; 

    @Basic(optional = false) 
    @Column(name = "description") 
    private String description; 

    @ManyToMany(cascade = {CascadeType.PERSIST}) 
    @JoinTable(name="joinelementsgroups", joinColumns={@JoinColumn(name="idgroup")}, inverseJoinColumns={@JoinColumn(name="idelement")}) 
    private Collection<Elements> elementsCollection; 

    . 
    . 
    More attributes, constructor and getter/setter 
    . 
    . 
} 

アイデアはたくさんの要素をラップするために、「要素」スーパークラスを持っていますいくつかの機能と機能を共有するシステムです。これらの要素は、いくつかのグループにグループ化できます。これは、データベースの構造である:私はValveサブクラスのオブジェクトを永続化し、一つのグループに追加するとき

enter image description here

、私は、データベース内の変更を見ることができます。このような何か:

SessionFactory sf = new Configuration().configure().buildSessionFactory(); 

    Session s = sf.openSession(); 
    Transaction tx = s.beginTransaction(); 
    Valve v1 = new Valve(); 
    Valve v2 = new Valve(); 
    s.save(v1); 
    s.save(v2); 
    tx.commit(); 

    tx = s.beginTransaction(); 
    LinkedList<Elements> valves = new LinkedList<>(); 
    valves.add(v1); 
    valves.add(v2); 
    ge.setElementsCollection(valves); 

    s.save(ge); 
    tx.commit(); 

//Database: OK 

そして、私はValveオブジェクトを取得するとき、私はそのゲッターメソッドを介して、オブジェクトが所属するグループを取得することができます。私は、そのすべての属性を取得することができElementsGroupsオブジェクトを取得しようとすると、問題が表示されますが、elementsCollectionではなく、前に追加Valve含むの空です:

tx = s.beginTransaction(); 
    Valve v1 = (Valve)s.get(Valve.class, 3); 
    for(ElementsGroups g : v1.getElementsGroupsCollection()) 
     System.out.println("Valve belongs to: " + g); 

    ElementsGroups ge = (ElementsGroups)s.get(ElementsGroups.class, 1); 
    System.out.println("Group number of elements: " + ge.getElementsCollection().size()); 

    tx.commit(); 

出力:

Valve belongs to: model.ElementsGroups[ idgroup=1 ] 
Group number of elements: 0 

私が持っているのこの問題を示していない類似の関係がすでに実装されているので、おそらくクラスの階層に関連しているはずですが、私はHibernateを初めて使っています。

PS:私はあなたが両側が参照しているように、ElementGroupsエンティティとバルブエンティティを移入するために忘れてしまったと思います、私はその読み取りを容易にするために、コードのいくつかの部分をdropedことに注意が、必要に応じて、私は

+0

ge.setElementsCollection(バルブ) - どこから来たのですか?それはトランザクションの外で作成されたようですか? –

+0

申し訳ありません@MaciejKowalskiは、それは私がデータベース内のオブジェクトを永続化するときに、このソリューションは動作しますが、トランザクションの内部で、私はすでにコード – Juan

答えて

1

を追加することができますお互いに:

tx = s.beginTransaction(); 
    LinkedList<Elements> valves = new LinkedList<>(); 

    Valve managedV1 = s.merge(v1); 
    Valve managedV2 = s.merge(v2); 

    valves.add(managedV1); 
    valves.add(managedV2); 

    managedV1.getElementsGroupsCollection().add(ge); 
    managedV2.getElementsGroupsCollection().add(ge); 

    ge.setElementsCollection(valves); 

    s.save(ge); 
    tx.commit(); 

また、私はあなたが2番目のトランザクションでバルブをマージする必要がありますと思います。

+0

感謝のこの部分を編集したのですが、私は一度オブジェクトを取得持続する場合、関係が含まれていません。データベースからオブジェクトを取得するにはどうすればよいですか?私はまだ、私は同じアプリケーションに実装多対多の関係は、私が唯一の「Session.get()」メソッドを持つオブジェクトを取得する必要がありますが、この実装でコレクションがあれば – Juan

+1

空のまま他の人に何か が欠けていると思います関係をロードしたければ、カスケードの上に@ManyToMany(fetch = FetchType.EAGER)を使用する必要があります。ただそれをrelationipの片側にだけ追加することを忘れないでください。 –