2017-02-22 54 views
1

У меня есть следующая иерархия в 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 
    . 
    . 
} 

Идея имея «Элементы» суперкласс, чтобы обернуть кучу элементов системы, которые разделяют некоторые харектеристики и функциональности. Эти элементы могут быть сгруппированы в несколько групп. Это структура базы данных:

enter image description here

Когда я сохранить объект в 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 и не знаю, что я чего-то не хватает.

пса: Обратите внимание, что я падаю на порядок несколько частей коды, чтобы облегчить его чтение, но я могу добавить, если необходимы

+0

ge.setElementsCollection (клапаны); - откуда он пришел? он создается за пределами транзакции? –

+0

Извините @MaciejKowalski, это внутри транзакции, я уже отредактировал эту часть кода – Juan

ответ

1

Я думаю, что вы забыли заполнить примитивы клапана с объектом ElementGroups так, что обе стороны имеют ссылки друг другу:

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

Также я думаю, что вы должны сначала объединить клапаны во второй транзакции.

+0

Спасибо, это решение работает, когда я сохраняю объект в базе данных, но когда я возвращаю объект, когда-то сохраняемый, отношения не включаются. Как я могу получить объект из базы данных? Я все еще думаю, что мне не хватает чего-то В других отношениях «многие ко многим», реализованных в одном приложении, мне нужно только восстановить объект с помощью метода «Session.get()», но с этой реализацией коллекция остается пустой – Juan

+1

Если вы хотите, чтобы отношения были загружены, а затем вы должны использовать @ManyToMany (fetch = FetchType.EAGER) поверх каскада. Не забудьте добавить его только на одной стороне отношений. –