回答问题

这就是我想要做的。

  1. 创建一个与孩子有 OneToOne 关系的父母

2.父母必须使用延迟加载来获取孩子

  1. 如果父母被移除,孩子也会被移除

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 不支持惰性的一对一关系。

长答案(解决方法)是:

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

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

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

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐