gpt4 book ai didi

java - hibernate 延迟错误但我不想要这些数据

转载 作者:行者123 更新时间:2023-12-01 12:45:06 25 4
gpt4 key购买 nike

我有一个带有几个字符串/数字/...的 POJO,我只想获取这个 pojo,而列表/映射/集中没有任何可以由 hibernate 附加的子 POJO。如果我执行查询来获取第一个 pojo,当有人触摸这些子对象时会抛出异常。

这是正常行为,我同意这一点,但是有没有办法不调用它:

object.setSomeMap(null);

但要将其设置为默认行为?我不认为像这样设置每个属性是最佳解决方案,因为我对所有内容都有相当大的模型。

谢谢!

最佳答案

将您的FetchType设置为FetchType.LAZY,当您从数据库加载类时它们将不会被加载。我给你举个例子:

@Entity
@Table(name="FOO")
public class Foo{

@Id
@GeneratedValue
@Column
private int id;

@Column
private String prop1;

@Column
private String prop2;

//You don't have to set fetch type like this, as lazy is the default for collections,
//but it doesn't really hurt anything
@OneToMany(fetch=FetchType.LAZY)
private List<Bar> listOfBars;
}

因此,当您加载 Foo 类时,idprop1prop2 将被加载并设置来自数据库,但 listOfBars 对象不会被填充。

每当您尝试访问 listOfBars 对象时,Hibernate 都会检测到它并尝试在您获取它之前填充这些对象。据我所知,如果您尝试将 listOfBars 设置为 null,Hibernate 将检测到这一点并尝试删除您的外键,如果您更新对象,则会有效地删除 listOfBars 的所有成员。例如:

@Transactional
public Foo doStuffWithFoo(int id){
Foo foo = fooDao.find(id);
//Set listOfBars to null so we can't call it.
//This is bad and will cause disaster when we update Foo.
foo.setListOfBars(null);

//Do some stuff with Foo that changes values.

fooDao.saveOrUpdate(foo);
return foo;
}

因为您在此处将 listOfBars 对象设置为 null,据我所知 Hibernate 将删除您的所有外键,因为您的列表不再存在。 Hibernate 知道空列表(因为它在创建对象时没有填充它)与您设置为 null/清空的列表之间的区别。如果是前者,它不会执行任何操作,除非需要时级联更新的状态。对于后者,如果您将 orphanRemoval 设置为 true,它将清除您的关联,可能会删除 Bar 对象。

但是,如果您在从方法返回 Foo 后尝试访问 listOfBars,则会遇到另一个问题。出现此问题的原因是,在您尝试访问 listOfBars 之前,您最初用于获取 Foo 类的 @Transactional session 已结束。此时您有 3 个选项,每个选项都有自己的问题。

第一个选项(这是大多数人尝试的,但因为它不起作用而感到沮丧)是您可以打开一个新 session ,并尝试填充您的 listOfBars 对象。 Hibernate 假定自事务结束以来,您的 Foo 对象和 listOfBars 中的所有 Bar 对象都可能发生更改(这是完全正确的) ,所以它会抛出异常。

另一种选择是再次获取整个 Foo 对象,并在新事务中填充 listOfBars 对象。这样做的问题是,像这样进行多个选择的效率非常低。

如果您知道 listOfBars 对象不存在,您的最后一个选择是永远不要尝试访问它。您甚至无法执行 null 检查,因为 Hibernate 将检测您对 getListOfBars() 的调用,并在 null 检查实际发生之前尝试填充该对象。

我编写了一个用于创建对象关系的 Hibernate 教程 here您可能会发现有帮助。我还讨论了集合的 Lazy 与 Eager 对象获取之类的问题,以及其他一些 Hibernate 的问题,这些问题在设计与 Hibernate 一起使用的类时会很有帮助。

祝你好运

关于java - hibernate 延迟错误但我不想要这些数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24780258/

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