hibernate中实体设计时属性类型选择问题
2017-08-18 11:21
260 查看
我们知道,hibernate并没有强制要求pojo(实体类 )属性必须是基本数据类型或者是包装类,但是我们把属性声明为基本数据类型( primitive types directly)或者包装类 ( wrapping classes for primitives)对我们代码的编写有着深远的影响。
a),使用基本数据类型意味着你所定义的属性不允许为空,这样你在获取该属性的时候就不可能会得到一个null值。
b),int在java中占32/64 bits,而Integer占了16个字节,所以使用Integer在性能方面要比int差一些。
a),当我们不想给这个属性设置任何值的时候,我们可以给它一个null值(前提是数据库的字段允许插入NULL)。
b),我们可以在pojo类中使用验证注解对属性的值做校验(例如: javax.validation.constraints.NotNull)
下面引用自hibernate官方文档
Cat has a property called id. This property maps to the primary key column(s) of a database table. The property might have been called anything, and its type might have been any primitive type, any primitive "wrapper" type, java.lang.String or java.util.Date.
...
We recommend that you declare consistently-named identifier properties on persistent classes and that you use a nullable (i.e., non-primitive) type.
可以看出,hibernate是建议开发者使用包装类的。
a),如果你的数据库字段是允许为空的,使用包装类。如果不允许为空,使用包装的时候,如果你往数据库插入null值,此时就会抛出异常。然后你就可以对异常进行捕获并处理。
b),使用基本数据类型的时候,如果字段是NULL,那么JDBC会返回0,但是这里会有一个问题。有可能0在你的业务逻辑代表着特定含义,这时候就可能出现一些意想不到的后果。
总结:在项目中去使用包装类型而不是基本数据类型,这样可以使你编写代码更简单,除非有人给你一个更好的理由去使用基本数据类型或者你的上头要求一定要使用基本数据类型。
1,使用基本数据类型的好处
a),使用基本数据类型意味着你所定义的属性不允许为空,这样你在获取该属性的时候就不可能会得到一个null值。b),int在java中占32/64 bits,而Integer占了16个字节,所以使用Integer在性能方面要比int差一些。
2,使用包装类的好处
a),当我们不想给这个属性设置任何值的时候,我们可以给它一个null值(前提是数据库的字段允许插入NULL)。b),我们可以在pojo类中使用验证注解对属性的值做校验(例如: javax.validation.constraints.NotNull)
3,hibernate官方推荐的做法
下面引用自hibernate官方文档Cat has a property called id. This property maps to the primary key column(s) of a database table. The property might have been called anything, and its type might have been any primitive type, any primitive "wrapper" type, java.lang.String or java.util.Date.
...
We recommend that you declare consistently-named identifier properties on persistent classes and that you use a nullable (i.e., non-primitive) type.
可以看出,hibernate是建议开发者使用包装类的。
4,两者在实际开发中的比较
a),如果你的数据库字段是允许为空的,使用包装类。如果不允许为空,使用包装的时候,如果你往数据库插入null值,此时就会抛出异常。然后你就可以对异常进行捕获并处理。b),使用基本数据类型的时候,如果字段是NULL,那么JDBC会返回0,但是这里会有一个问题。有可能0在你的业务逻辑代表着特定含义,这时候就可能出现一些意想不到的后果。
总结:在项目中去使用包装类型而不是基本数据类型,这样可以使你编写代码更简单,除非有人给你一个更好的理由去使用基本数据类型或者你的上头要求一定要使用基本数据类型。
相关文章推荐
- 处理Hibernate中Pojo对象String属性不能映射Sqlserver2005 text类型字段问题 .
- struct框架中实体类中属性的类型错误问题
- Hibernate 中boolean类型属性问题
- hibernate实体层次设计之三种类型的继承形式(一)
- EF 序列化实体为Json时的循环引用问题(不用自己写实体,不用匿名类型,不用EF的上下文属性)
- 关于eclipse没有hibernate包的问题及更改反向工程文件生成的属性类型问题
- 处理Hibernate中Pojo对象String属性不能映射Sqlserver2005 text类型字段问题
- 对于数据库设计者而言,在设计表属性类型时应该考虑哪些问题?
- Hibernate 中boolean类型属性问题
- 沫沫金::hibernate实体增加属性后不能自动生成表的问题研究
- 数据库设计中的选择:实体成为属性还是表;二元关系还是多元关系;
- hibernate实体层次设计之三种类型的继承形式(二)
- hibernate实体层次设计之三种类型的继承形式(三)
- 关于hibernate的实体类中有集合类型转化成JSON的工具类 - 怀念今天的专栏 - 博客频道
- 【转】NET中反射实现 可空类型 与基础类型的转换 以及获取指定属性的大小问题
- 解决VS2013使用MySQL无法创建ADO.NET实体数据类型的问题
- ADO.NET Entity framework 中 实体的对应数据库中text类型的问题 (更新) :asp.net entity 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数 3 ("@0"): 数据类型 0
- Oracle10g JDBC ojdbc14 DATE类型hibernate查询时分秒问题
- 『算法设计_伪代码』贪心算法_活动选择问题
- mysql数据库设计中日期类型的选择与比较及表情符号支持