java在hibernate映射中使用包装整数类或int原语
在我工作的公司里,我们主要讨论了是否应该更好地为原语(java.lang.Integer、java.lang.Long)使用包装类,还是直接在POJO中使用原语类型,将实体映射到Hibernate中的表
我们希望这些值在数据库中不为null
支持使用原语的参数:
- 将这些值作为int处理意味着它们在任何情况下都不能为null 这样就不可能无意中获得空引用 在球场上李>
- int=32/64位内存。整数=16字节内存 而且速度也比较慢
支持使用包装器对象的参数:
- 我们可以在数据库级别添加约束,以始终防止null 从那里得到的价值
- 我们最终可能会得到误导性的数据,我们可以 当用户不需要时,在数据库中使用0而不是null 设置一个值,错误的数据是一个棘手的问题李>
- 对象比原语具有更大的表达能力。我们有空值,也有 整数值,因此我们可以使用注释更容易地验证它们 示例(javax.validation.constraints.NotNull)李>
# 1 楼答案
使用包装纸,让你的生活变得简单
你的数据模型应该说明这一点。无论如何,您都应该在数据库中强制执行可空性
如果它们在数据库中为空,则使用包装器。如果它们不可为null,并且您使用包装器,那么如果您尝试在数据库中插入null,就会出现异常
如果你的数据模型没有规定,那么就按照惯例,一直使用包装器。这样一来,人们就不必思考,也不必判定值0意味着空值
我还想质疑你的说法,即它的性能会降低。你量过这个了吗?我是说真的测量了吗?在与数据库交谈时,除了16位和32位之间的差异外,还有很多考虑因素
只需使用简单、一致的解决方案。在任何地方都要使用包装纸,除非有人给了你一个很好的理由(有精确的统计数据)不这样做
# 2 楼答案
{a1}(只是我碰巧找到的第一个版本)声明:
所以“专家的声音”建议使用
Integer
/Long
。。。但是没有描述为什么会这样我想知道是否可以创建一个尚未持久化的对象,而不使用标识符(即属性值为^{),从而将其与持久化的实体区分开来
# 3 楼答案
我认为应该提到:
Hibernate建议(第4.1.2节)在持久类中使用非原语属性实际上指的是标识符属性(如标题所示):
尽管如此,原语的优势并不明显: