gpt4 book ai didi

java - Hibernate 不允许带有 int 字段的嵌入对象为空?

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:56 25 4
gpt4 key购买 nike

Hibernate 不允许我持久化包含带有整数字段的空嵌入对象的对象。例如,如果我有一个名为 Thing 的类,看起来像这样

@Entity
public class Thing {

@Id
public String id;

public Part part;

}

其中 Part 是一个看起来像这样的可嵌入类

@Embeddable
public class Part {

public String a;

public int b;

}

然后尝试使用空 Part 保存 Thing 对象会导致 Hibernate 抛出异常。特别是这段代码

Thing th = new Thing();
th.id = "thing.1";
th.part = null;
session.saveOrUpdate(th);

导致 Hibernate 抛出这个异常

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.ace.moab.api.jobs.Thing.part

我猜这是因为 Part 是一个嵌入式类,所以 Part.a 和 Part.b 只是 Thing 数据库表中的列。由于 Thing.part 为空,Hibernate 希望将 thing.1 的行的 Part.a 和 Part.b 列值设置为空。但是,Part.b 是一个整数,Hibernate 不允许数据库中的整数列为空。这就是导致异常的原因,对吧?

所以我正在寻找解决此问题的方法。我注意到将 Part.b 设为 Integer 而不是 int 似乎可行,但出于我不会让您厌烦的原因,这对我们来说不是一个好的选择。谢谢!

最佳答案

我找到了另一种解决方法,并认为我会分享它。事实证明,如果您使 int 列可为空,则 Hibernate 不会抛出 PropertyValueException。

@Column(nullable = true)
public Integer b;

这对我们有用,因为启用 hibernate 的应用程序是唯一接触数据库的东西,因此我们可以保证只有当该部分为空时 b 才为空。尽管 null 部分建议和使用 Integer 包装器类型是很好的建议,但由于很多我无法真正控制的原因,将列设置为 nullable 最适合我们。谢谢,我希望这对其他人有帮助。

关于java - Hibernate 不允许带有 int 字段的嵌入对象为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2838528/

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