小编典典

Hibernate OneToOne延迟加载和级联

hibernate

这就是我想要做的。

  1. 创建具有与孩子的OneToOne关系的父母
  2. 父母必须使用延迟加载来获取孩子
  3. 如果父母被删除,孩子也被删除
  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()

我的第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);
    }
}

阅读 339

收藏
2020-06-20

共1个答案

小编典典

我一直有一个类似的问题。有几种不同的解决方案,但所有解决方案都可以。

简短的答案是:Hibernate不支持懒惰的一对一关系。

长答案(解决方法)是:

  1. 将关系声明为一侧(孩子)一对一,另一侧(父母)一对多。因此,a parent.getchild()返回一个集合,但是它将能够使用延迟加载。

  2. 您可以尝试让父级和子级共享主键,但这将需要您更改架构。

  3. 您可以尝试在数据库中配置一个反映这种一对一关系的视图。

2020-06-20