这就是我想要做的。
班级家长
@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点则 部分正常工作,仍然需要解决如何翻译更新部分indo 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();
产生的hibernate查询,一个获取父对象和一个获取子对象:
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); } }
我一直有一个类似的问题。有几种不同的解决方案,但所有解决方案都可以。
简短的答案是:Hibernate不支持懒惰的一对一关系。
长答案(解决方法)是:
将关系声明为一侧(孩子)一对一,另一侧(父母)一对多。因此,a parent.getchild()返回一个集合,但是它将能够使用延迟加载。
parent.getchild()
您可以尝试让父级和子级共享主键,但这将需要您更改架构。
您可以尝试在数据库中配置一个反映这种一对一关系的视图。