TABLE_PER_CLASS Двунаправленная проблема @OneToMany - PullRequest
2 голосов
/ 10 марта 2011

Hibernate может делать двунаправленный полиморфизм с TABLE_PER_CLASS (<union-subclass>), так говорит здесь :

Эта стратегия поддерживает связи «один ко многим» при условии, что они являются двунаправленными.

Я пытаюсь заставить работать простой пример. 4 основных класса: реферат A <- <strong>B <- <strong>C и A <- <strong>D , где D содержит myArray B's.

Я не получаю ошибки; myArray просто пусто.

Подробнее

A

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Class_A {
    @Id
    public int myId = 0;
    public int a = 0;
}

B

@Entity
public class Class_B extends Class_A {
    public int b = 0;

    @ManyToOne
    @JoinColumn(name="join_column_b")
    private Class_D class_d;
}

C

@Entity
public class Class_C extends Class_B {
    public int c = 0;
}

D

@Entity
public class Class_D extends Class_A {
    @OneToMany(cascade=CascadeType.ALL, mappedBy="class_d", fetch=FetchType.EAGER)
    public List<Class_B> myArray;

    public Class_D() {
        myArray = new ArrayList<Class_B>();
    }
}

код

// Definition.
Class_B b = new Class_B(); b.myId =  9;
Class_C c = new Class_C(); c.myId = 18;
Class_D d = new Class_D(); d.myId = 92;
d.myArray.add(b);
d.myArray.add(c);

// Saving.
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(d);
session.getTransaction().commit();
session.close();

// Loading.
Session session2 = sessionFactory.openSession();
session2.beginTransaction();
Class_D d2 = (Class_D)session2.createQuery("from " + Class_D.class.getName()).uniqueResult();
session2.getTransaction().commit();
session2.close();

В отладчике я могу сравнить экземпляр d с d2 (они не совпадают, но имеют одинаковый myId). d2 имеет пустой myArray.

Нет исключений - Нет ошибок Oracle - Нет ничего

Почему?

Примечания:
1. Hibernate 3.6.0 Final + Oracle 11g + чистая Java
2. Использование аннотаций
3. Я просмотрел это и это , но все еще не могу заставить этот простой пример работать ( ffs! )
4. Я буду в состоянии обновить в следующее воскресенье - пожалуйста, прости меня, если я не отвечу до тех пор

1 Ответ

2 голосов
/ 10 марта 2011

При сохранении связи с базой данных Hibernate смотрит на собственника.Для двунаправленных отношений «один ко многим» сторона-владелец - это «многие», т. Е. Class_B в вашем случае.

Поэтому база данных отражает состояние Class_B.class_d, и вы должны установить его значение при сопоставлении Class_B с Class_D (было бы лучше создать метод для установки обеих сторон одновременно):

public class Class_D {
    ...
    public void addToMyArray(Class_B class_b) {
        myArray.add(class_b);
        class_b.setClass_D(this);
    }
}

d.addToMyArray(b);
d.addToMyArray(c);
...