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

Jas*_*vak 11 java orm hibernate jpa

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

@Entity
public class Thing {

    @Id
    public String id;

    public Part part;

}
Run Code Online (Sandbox Code Playgroud)

Part是一个嵌入式类,看起来像这样

@Embeddable
public class Part {

    public String a;    

    public int b;

}
Run Code Online (Sandbox Code Playgroud)

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

Thing th = new Thing();
th.id = "thing.1";
th.part = null;
session.saveOrUpdate(th);
Run Code Online (Sandbox Code Playgroud)

导致Hibernate抛出此异常

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.ace.moab.api.jobs.Thing.part
Run Code Online (Sandbox Code Playgroud)

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

所以我正在寻找这个问题的解决方法.我注意到使Part.b成为一个Integer而不是一个int似乎有效,但是由于我不会厌烦你,这对我们来说不是一个好选择.谢谢!

Jas*_*vak 7

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

@Column(nullable = true)
public Integer b;
Run Code Online (Sandbox Code Playgroud)

这对我们有用,因为我们启用了hibernate的应用程序是唯一触及数据库的东西,所以我们可以保证只有当part为null时b才为null.虽然null部分建议和Integer包装器类型的使用是很好的建议,但由于很多原因我无法控制,将列设置为nullable对我们来说效果最好.谢谢,但我希望这有助于其他人.