当前位置: 首页 > 面试题库 >

Hibernate OneToOne延迟加载和级联

沃阳飙
2023-03-14
问题内容

这就是我想要做的。

  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);
    }
}

问题答案:

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

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

长答案(解决方法)是:

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

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

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



 类似资料:
  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 问题内容: 我在JPA实体中的延迟加载属性有问题。我读过许多类似的问题,但它们与spring或hibernate有关,并且他们的后代不适用或没有帮助。 该应用程序是在Wildfly应用程序服务器上运行的JEE和JPA2.1。有两个实体,DAO会话bean和servlet将它们放在一起: 当我运行此代码时,它失败并显示: 我对WebLogic / JPA1使用了非常相似的模式,并且运行平稳。任何的想

  • 问题内容: 我想知道在node.js中使用是否等效于延迟加载? 例如,如果我有一个函数需要代码中其他任何地方都不需要的特定node.js包,那么我最好在该函数内部使用它,以便仅在调用该函数时才包含所需的包。 我还不确定是否会由于缺乏对node.js架构的了解而在性能方面有所改善?我想它每次与服务器的连接都会使用更少的内存。但是,当它必须读取程序包时,它会增加磁盘的I / O吗,还是将其添加到内存中

  • 这是从这里开始的后续行动。 我正在实现一个表,它将数据异步加载到表单元格中。问题是,表单元格有时无法正确更新。有时它会以某种方式“挂起”并永远显示“加载...”。实际值只有在我在表中滚动一点时才会更新。 要复制,请在表格中快速向下滚动应用程序。某些单元格不会显示“延迟加载”值,而是显示占位符字符串。 延迟加载属性如下所示: } 应用程序如下所示: 完整的可运行代码可以在这里找到。

  • 有很多关于“懒惰”的例子和文档。也许我没有明白,但为什么要用它呢?实例化bean成本

  • 使用最新的jstree。我可以加载所有节点,但现在我正在尝试延迟加载节点。当我展开最后一个可见节点时,不会生成GET。 .js 从初始调用返回的JSON数据是[{"state":{"open": true,"禁用": false,"选择": false},"id":"-100","text":"Node1 Text","子":[{"state":{"open": false,"禁用": false