から多対多の関係でオブジェクトのコレクションを取得できません:は、私が休止状態で次の階層を持つデータベース
@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
サブクラスのオブジェクトを永続化し、一つのグループに追加するとき
、私は、データベース内の変更を見ることができます。このような何か:
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ことに注意が、必要に応じて、私は
ge.setElementsCollection(バルブ) - どこから来たのですか?それはトランザクションの外で作成されたようですか? –
申し訳ありません@MaciejKowalskiは、それは私がデータベース内のオブジェクトを永続化するときに、このソリューションは動作しますが、トランザクションの内部で、私はすでにコード – Juan