Вот что я пытаюсь сделать.
- Создать родителя с отношением OneToOne к ребенку
- Родитель должен выбрать детей, используя ленивую загрузку
- Если родитель удален, то и дочерний элемент
- Если дочерний элемент удален, родитель не должен быть затронут
- Каскадное обновление и удаление должны быть переведены в DDL
класс Родитель
@OneToOne(mappedBy = "parent", cascade = CascadeType.ALL)
public Child getChild()
класс Ребенок
@OneToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name="parent_id")
public Parent getParent()
У меня точка 1,3, 4 полностью работает и Точка 5 частично работает, еще нужно решить, как перевести часть обновления в DDL.
Точка 2 большаяпроблема здесь, с моим текущим решением родитель не загружает ребенка лениво.Однако ребенок загружает родителя лениво, но инвертирование аннотаций может привести к путанице в каскаде (, пункты 3, 4 и 5 ).
Я сейчас очень смущен, надеясь, что я 'мы упустили что-то очевидное, поэтому любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ: Код, запрошенный Adeel Ansari
'fetch = FetchType.LAZY' был добавлен в классParent, в остальном такой же, как указано выше.
IParentDAO parentDAO = DAOFactory.getFactory().getParentDAO();
parentDAO.beginTransaction();
//findByPrimaryKey uses 'org.hibernate.Session.get(Class clazz, Serializable id)'
parentDAO.findByPrimaryKey(1l);
parentDAO.commitTransaction();
Полученные запросы гибернации, одна выборка Parent и одна выборка Child:
Hibernate: select parent0_.id as id0_0_ from parents parent0_ where parent0_.id=?
Hibernate: select child0_.id as id1_0_, child0_.parent_id as parent2_1_0_ from childs child0_ where child0_.parent_id=?
Вот код для findByPrimaryKey:
public class HibernateParentDAO extends HibernateDAO<Parent, Long> implements IParentDAO {
public HibernateParentDAO() {
super(Parent.class);
}
}
public abstract class HibernateDAO<T, ID extends Serializable> implements IGenericDAO<T, ID> {
private Class<T> persistentClass;
public HibernateDAO(Class<T> c) {
persistentClass = c;
}
@SuppressWarnings("unchecked")
public T findByPrimaryKey(ID id) {
return (T) HibernateUtil.getSession().get(persistentClass, id);
}
}