У меня есть следующая иерархия в Hibernate:Не удается получить коллекцию объектов в многие-ко-многим из базы данных
@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 и не знаю, что я чего-то не хватает.
пса: Обратите внимание, что я падаю на порядок несколько частей коды, чтобы облегчить его чтение, но я могу добавить, если необходимы
ge.setElementsCollection (клапаны); - откуда он пришел? он создается за пределами транзакции? –
Извините @MaciejKowalski, это внутри транзакции, я уже отредактировал эту часть кода – Juan