Hibernate OneToOne 延迟加载和级联
·
回答问题
这就是我想要做的。
- 创建一个与孩子有 OneToOne 关系的父母
2.父母必须使用延迟加载来获取孩子
- 如果父母被移除,孩子也会被移除
4.如果孩子被移除,父母应该不会受到影响
5.级联更新和删除必须翻译成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()
我有 point 1, 3, 4 完全工作和 Point 5 部分工作,仍然需要解决如何翻译更新部分 indo DDL。
第 2 点 是这里的大问题,使用我当前的解决方案,父母不会懒惰地加载孩子。然而,孩子确实会懒惰地加载父母,但反转注释会打乱级联(点 3、4 和 5)。
我现在很困惑,希望我错过了一些明显的东西,所以任何帮助将不胜感激。
编辑: Adeel Ansari 要求的代码
'fetchu003dFetchType.LAZY' 已添加到类 Parent 中,否则同上。
IParentDAO parentDAO = DAOFactory.getFactory().getParentDAO();
parentDAO.beginTransaction();
//findByPrimaryKey uses 'org.hibernate.Session.get(Class clazz, Serializable id)'
parentDAO.findByPrimaryKey(1l);
parentDAO.commitTransaction();
生成的休眠查询,一个获取父级,一个获取子级:
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);
}
}
Answers
我一直有一个类似的问题。有几种不同的解决方案,但它们都是解决方法。
简短的回答是:Hibernate 不支持惰性的一对一关系。
长答案(解决方法)是:
- 将关系声明为一方面是一对一(孩子),另一方面是一对多(父母)。因此
parent.getchild()
返回一个集合,但它可以使用延迟加载。
2.您可以尝试让父子共享主键,但这需要您更改架构。
- 您可以尝试在数据库中配置一个反映这种一对一关系的视图。
更多推荐
所有评论(0)