2014-12-30 2 views
0

Я пытаюсь выяснить, как настроить спящий режим для следующих таблиц.Hibernate Parent/Child/Grandchild OneToMany Access

CREATE TABLE parent (
    id BIGINT 
); 
CREATE TABLE child (
    id BIGINT, 
    parent_id BIGINT 
); 
CREATE TABLE grandchild (
    id BIGINT, 
    child_id BIGINT 
); 

У меня есть конфигурация работает для доступа детей из родителей (OneToMany) и внуков от ребенка (OneToMany), однако, я борюсь с отображением, что позволяет мне получить доступ к внукам из parent (OneToMany).

Вот отображения Hibernate я в настоящее время:

public class Parent { 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "child") //This is the mapping that doesn't work 
    private Set<Grandchild> grandchildren; 
} 
public class Child { 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "parent_id", referencedColumnName = "id") 
    private Parent parent; 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "child") 
    private Set<Grandchild> grandchild; 
} 
public class Grandchild { 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "child_id", referencedColumnName = "id") 
    private Child child; 
} 

ответ

0

Вы должны использовать JoinTable аннотации

public class Parent { 
    @OneToMany(fetch = FetchType.LAZY) 
    @JoinTable 
    (
     name="child", 
     joinColumns={ @JoinColumn(name="parent_id", referencedColumnName="id") }, 
     inverseJoinColumns={ @JoinColumn(name="id", referencedColumnName="child_id") } 
    ) 
    private Set<Grandchild> grandchildren; 
} 

Теперь вы можете, например, забрать все родитель вместе с внуками:

em.createQuery("select p from Parent p inner join fetch p.grandchildren").getResultList(); 

Он будет производить следующие SQL запрос:

select 
    parent0_.ID as ID2_0_, 
    grandchild2_.ID as ID1_1_, 
    grandchild2_.child_id as child2_1_1_, 
    grandchild1_.parent_id as parent1_2_0__, 
    grandchild1_.id as id0__ 
from 
    Parent parent0_ 
inner join 
    child grandchild1_ 
     on parent0_.ID=grandchild1_.parent_id 
inner join 
    Grandchild grandchild2_ 
     on grandchild1_.id=grandchild2_.child_id 
+0

По какой-то причине, что дает мне сообщение об ошибке: '[PersistenceException: Запрос бросил SQLException: ОШИБКА: колонка t0.parent_id не существует позиций: 8 значения Bind: [1] Запрос был: выберите t0.parent_id как c0, t0.id как c1 из grandchild t0 где (t0.parent_id) в (?) ' – MrGrinst

+0

@MrGrinst Я протестировал его, и он работает для меня. Пожалуйста, предоставьте свои конечные классы сущностей и полный SQL из исключения – bedrin

+0

@MrGrinst нет, я использовал точно такое же сопоставление, которое вы разместили, - вы можете видеть в запросе, что Grandchild имеет псевдоним grandchild2_, и мы используем только два столбца: ID который является суррогатным ключом для внуков и child_id, который является внешним ключом к таблице для детей. – bedrin