Hibernate: java.lang.Integer和int之间的任何区别



<property name="pwdRetryCount" type="java.lang.Integer">
    <column name="pwd_retry_count" />
</property>

<property name="pwdRetryCount" type="int">
    <column name="pwd_retry_count" />
</property>

它们只有在处理空值时才有明显的区别。

这是因为int是不能赋null的原始数据类型,而java.lang.Integerint的包装类,可以接受null。

因此,如果pwd_retry_count列是可空的,并且您使用int来映射您的实体对象,对于pwd_retry_count为空的记录,发生错误,因为int不能存储空。

上面的答案完全正确,我只是输入了额外的信息。

为可选值使用可空类型(如Integer, Double等盒装基本类型)。这取决于您的模型,如果特定值是可选的有意义。如果它必须有默认值,你可以创建@PreX回调(例如@PreLoad)或重写getter来返回具有默认值的基本类型。

为需要的值使用基本类型。如果您区分这两种方法,它有一些很大的好处,例如:

  1. 如果让hibernate生成DDL,它会自动为基本类型创建不为空的约束。
  2. 如果你在web对象和实体之间做映射,你有隐含的NPE,这表明你的代码中有问题,这种行为不会使你的数据不一致

还有一件有趣的事。如果你使用Lombok库,喜欢在实体上使用@Getter和@Setter,并且你用Persistable接口控制SelectBeforeInsert行为,那么你应该总是使用像Integer这样的大框类型,因为你不能用像Persistable这样的基本类型做泛型。如果你使用Persistable + lombok的@Getter +你的ID被命名为" ID "那么你就有了getId的隐式重写getter方法。

最新更新