2016-12-16 3 views
0

Я хочу, чтобы мой запрос HQL возвращал объект вместе со своей коллекцией детей.Hibernate - Как получить детскую коллекцию?

НВМ:

<class name="Object" table="OBJECT"> 

<id name="id" column="IDOBJECT" type="long" access="field"> 
<generator class="sequence"> 
    <param name="sequence">OBJECT_SEQ</param> 
</generator> 
</id> 

<many-to-one name="parent" column="IDPARENT" class="Parent" embed-xml="true" /> 

<set name="children" inverse="true" cascade="all-delete-orphan"> 
    <key column="IDOBJECT" /> 
    <one-to-many class="Child" /> 
</set> 

Запрос:

SELECT o from Object o JOIN FETCH o.parent JOIN FETCH o.children 

В конце:

  • o.parent забирается

  • o.children равна нулю

Дети ARE в базе данных и связанные с возвращенным объектом.

ответ

1

Я проверил структуру баз данных с аннотацией на основе и все это fine.Test его на вашей стороне, и проверить, что вы пропустите:

Ребенок:

@Entity 
@Table(name = "child") 
@XmlRootElement 
public class Child implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Integer id; 
    @Size(max = 255) 
    @Column(name = "name") 
    private String name; 
    @JoinColumn(name = "idobject", referencedColumnName = "id") 
    @ManyToOne(fetch = FetchType.LAZY) 
    private entity.Object object; 

    public Child() { 
    } 

    public Child(Integer id) { 
     this.id = id; 
    } 

    //getter and setters 
} 

Объект:

@Entity 
@Table(name = "object") 
@XmlRootElement 
public class Object implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Integer id; 
    @Size(max = 255) 
    @Column(name = "name") 
    private String name; 
    @OneToMany(mappedBy = "object", fetch = FetchType.LAZY) 
    private List<Child> children; 
    @JoinColumn(name = "idparent", referencedColumnName = "id") 
    @ManyToOne(fetch = FetchType.LAZY) 
    private Parent parent; 

    public Object() { 
    } 

    public Object(Integer id) { 
     this.id = id; 
    } 
    //getter and setter 
} 

Родитель:

@Entity 
@Table(name = "parent") 
@XmlRootElement 
public class Parent implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Integer id; 
    @Size(max = 255) 
    @Column(name = "name") 
    private String name; 
    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) 
    private List<entity.Object> objects; 

    public Parent() { 
    } 

    public Parent(Integer id) { 
     this.id = id; 
    } 
//getter and setters 
} 

и мой запрос:

public class ObjectDao { 

    public static List<Object> getObjects() { 
     EntityManager em = Persistence.createEntityManagerFactory("test").createEntityManager(); 
     try { 
      Query query = em.createQuery("SELECT o from Object o JOIN FETCH o.parent JOIN FETCH o.children"); 
      List l = query.getResultList(); 
      return l; 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      return new ArrayList<Object>(); 
     } finally { 
      em.close(); 
     } 
    } 
} 

мой сервлет для отладки:

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    List<entity.Object> objects = ObjectDao.getObjects(); 
    for (entity.Object obj : objects) { 
     System.out.println("object name:" + obj.getName()); 
     System.out.println("parent name:" + obj.getParent().getName()); 
     List<Child> children = obj.getChildren(); 
     System.out.println("children:"); 
     for(Child c: children){ 
      System.out.println(c.getName()); 
     } 
    } 
} 

Результат:

object name:Object 1 
parent name:Parent 1 
children: 
Child Name 
+1

Tank Вы для вас ответ я буду стараться использовать его и найти то, что проблема есть. Я опубликую что-нибудь, когда оно будет разрешено. – Flyout

+0

Теперь это работает, я не знаю, что пошло не так. – Flyout

Смежные вопросы