gpt4 book ai didi

java - Hibernate自引用关系和延迟加载

转载 作者:行者123 更新时间:2023-12-02 00:08:28 24 4
gpt4 key购买 nike

在提出问题之前,这是我的问题的背景:

我有一个名为“Category”的特定实体,它有一个属性“Category”(父级)和另一个类型为“latedEntity”的属性。

以下是代码示例:

@Entity
public class Category {

...

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="entityID")
private RelatedEntity entity;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="parentID")
private Category parent;

...
}

因此,如您所见,我为这些属性声明了 ManyToOne 关系,以及延迟加载获取策略。

现在,我在 DAO 对象中使用此方法来获取类别列表:

public List<Category> getAll() {
Criteria crit = sessionFactory.getCurrentSession().createCriteria(Category.class);
return (crit.list());
}

我得到了一个调用 DAO 方法的特定服务对象:

@Transactional(readOnly = true)
public List<Category> getAllCategories() {
return (categoryDAO.getAll());
}

目前没什么特别的...现在,我的单元测试来了:

@Test
public void testCategories() {

List<Category> cat = service.getAllCategories();
assertNotNull(cat);
assertFalse(cat.isEmpty());

for (Category c : cat) {

try {
assertNotNull(c.getEntity().getName());
fail("Expected lazy init. on Category.Entity");
}
catch(LazyInitializationException ex) {
//Exception is caught
}

try {
assertNotNull(c.getParent().getName());
//No exception
fail("Expected lazy init. on Category.Parent");
}
catch(LazyInitializationException ex) {}
}
}

运行测试后,在第一个 try/catch block 中捕获异常,并触发第二个失败,表明该类别的父属性上没有 LazyInitException。

所以我可以打电话

c.getParent().getParent().getName(); 

c.getParent().getParent().getParent().getName() 

没有引发任何异常。

我在配置文件中设置了“show_sql=true”,在调用父属性上的 getter 后,我在日志中看不到任何补充请求,因此没有新请求,但加载了父属性。

有人可以解释一下为什么父属性不懒惰吗?

编辑:

我已经更新了我的测试用例。

@Test(expected=LazyInitializationException.class)   
public void lazyCategoriesParentsList() {
List<Category> cat = service.getAllCategories();

assertNotNull(cat);
assertFalse(cat.isEmpty());

for (Category c : cat) {
assertNotNull(c.getParent().getName());
}
}

现在测试已经通过了...它与我之前的测试用例中实体属性的访问(通过 c.getEntity())有关吗?

最佳答案

您可以尝试只获取一个类别,而不是全部加载吗?

事实上,当你加载一个类别时,如果hibernate可以在同一个 session 中找到它的父级,它就会初始化它,甚至如果父级被标记为惰性。当您查询所有类别时,它将找到 Session 中的所有父级并初始化它们。

关于java - Hibernate自引用关系和延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13376706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com