JPA/Hibernate实体类属性选Wrapper类还是基本类型的最佳实践是什么?
JPA/Hibernate实体类属性类型最佳实践
结论
公认的最佳实践是选择包装类(方案二),不推荐使用基本类型(方案一)。
方案一(不推荐:使用基本类型)
@Entity class User { @Id private int uuid; private long code; private boolean isActive; // setter & getter }
方案二(推荐:使用包装类)
@Entity class User { @Id private Integer uuid; private Long code; private Boolean isActive; // setter & getter }
具体原因
- 符合数据库null值的语义表达
数据库的字段允许存储null值,而Java基本类型不支持null,会使用默认值赋值:int默认0、long默认0、boolean默认false。这会导致业务逻辑歧义,你无法判断属性值的0/false是业务真实存储的数据,还是数据库null值转换过来的默认值,极易引发隐性业务bug。 - 兼容Hibernate实体状态判断逻辑
Hibernate判断实体是「瞬时态(未持久化,需要执行insert)」还是「游离态(已持久化,需要执行update)」的核心依据之一就是主键是否为null。如果主键用int基本类型,new出来的实体默认主键值为0,Hibernate会误判为该实体已经持久化,执行save操作时会触发update而非insert,直接抛出找不到对应记录的异常。 - 兼容ORM框架的校验、查询逻辑
如果你需要使用@NotNull等空值校验注解,基本类型默认有值会导致注解完全失效;做条件查询时,如果要查询某字段为null的记录,基本类型无法传入null作为查询参数,会额外增加很多兼容逻辑。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

