Hibernate映射
程序员文章站
2022-04-16 22:42:43
...
1. 自然主键, 代理主键
代理主键,不具备业务含义的字段,
应尽量避免使用自然主键
2. 用 == 比较两个对象的内存地址是否相同, Object类的equals(object o), 也是按内存地址来比较的,如果用户类没有覆盖 equal方法,也是按地址比较
JAVA API中的一些类覆盖了Object类的equal(Object o)方法,实现按对象值比较,他们包括
String类,Date类,Byte,Integer,Short,Character,Long,Float,Double,Boolean
3.
increament
identity
sequence
hilo
native
assigned 适用于自然主键,有程序设定其值
4. increment
increment标识符生成器仅仅在只有单个Hibernate的应用程序访问数据库情况下才能有效工作,即在同一个进程中创建两个连接数据库的SessionFactory实例,会导致插入失败
increment 生成标识符机制不依赖于底层数据库,适合于所有系统
适用于只有单个Hibernate应用进程的程序,在集群下不推荐
5. identity
依赖于数据库,要求数据库必须支持
DB2,MySQL,Ms SQL Server, Sybase, HSQLDB, informix
6. sequence
依赖于数据库,要求数据库必须支持
Oracle, DB2
7. hilo
不依赖数据库, 适用于所有数据库
8. native
native依据底层数据库对自动生成标识符的支持能力,自动选择使用identity,sequence,hilo
适合跨平台开发,多个数据库
9. 映射自然主键
assigned 表示程序为NAME属性赋值,不管是游离对象,还是持久化对象,NAME属相永远不会为NULL,因此saveOrUpdate()方法无法通过判断name属性是否为null来确定对象状态,在这种情况下,可以设置<version>院所的unsave-value属性, 如果属性为0,表示链式对象,否则为游离对象(从数据库中读出的对象)
还可以
a. 避免使用saveorUpdate, 分别调用save or update()
b. 使用Hibernate拦截器, 在Interceptor实现类的isUnsave()方法中区分
10. 映射复合自然主键
映射复合自然主键时,为了能使Session的load()方法正常运行,要求类必须实现java.io.Serializable接口,并且重新定义equals() 和 hashcode()方法, equals方法判断相等的条件为,两个对象的name属性和companyId属性相等
代理主键,不具备业务含义的字段,
应尽量避免使用自然主键
2. 用 == 比较两个对象的内存地址是否相同, Object类的equals(object o), 也是按内存地址来比较的,如果用户类没有覆盖 equal方法,也是按地址比较
JAVA API中的一些类覆盖了Object类的equal(Object o)方法,实现按对象值比较,他们包括
String类,Date类,Byte,Integer,Short,Character,Long,Float,Double,Boolean
3.
increament
identity
sequence
hilo
native
assigned 适用于自然主键,有程序设定其值
4. increment
increment标识符生成器仅仅在只有单个Hibernate的应用程序访问数据库情况下才能有效工作,即在同一个进程中创建两个连接数据库的SessionFactory实例,会导致插入失败
increment 生成标识符机制不依赖于底层数据库,适合于所有系统
适用于只有单个Hibernate应用进程的程序,在集群下不推荐
5. identity
依赖于数据库,要求数据库必须支持
DB2,MySQL,Ms SQL Server, Sybase, HSQLDB, informix
6. sequence
依赖于数据库,要求数据库必须支持
Oracle, DB2
7. hilo
不依赖数据库, 适用于所有数据库
8. native
native依据底层数据库对自动生成标识符的支持能力,自动选择使用identity,sequence,hilo
适合跨平台开发,多个数据库
9. 映射自然主键
<id name="name" column="NAME" type="string">
<generator class="assigned"/>
</id>
.......
<version name="version" column="VERSION" unsaved-value="0"/>
assigned 表示程序为NAME属性赋值,不管是游离对象,还是持久化对象,NAME属相永远不会为NULL,因此saveOrUpdate()方法无法通过判断name属性是否为null来确定对象状态,在这种情况下,可以设置<version>院所的unsave-value属性, 如果属性为0,表示链式对象,否则为游离对象(从数据库中读出的对象)
还可以
a. 避免使用saveorUpdate, 分别调用save or update()
b. 使用Hibernate拦截器, 在Interceptor实现类的isUnsave()方法中区分
10. 映射复合自然主键
<composite-id>
<key-property name="name" column="NAME" type="string">
<key-property name="companyId" column="COMPANY_ID" type="long">
</composite-id>
<version name="version" column="VERSION" unsaved-value="0"/>
映射复合自然主键时,为了能使Session的load()方法正常运行,要求类必须实现java.io.Serializable接口,并且重新定义equals() 和 hashcode()方法, equals方法判断相等的条件为,两个对象的name属性和companyId属性相等
上一篇: 新旧玩家轮番入场,社交电商能否成为拉动新经济的“高铁”?
下一篇: Hibernate 映射
推荐阅读
-
struts2+Spring3+hibernate3零配置并且正式环境和开发环境不需要多大改动 Struts
-
Eclipse“警告: 编码 GBK 的不可映射字符”的解决方法 Eclipse
-
使用hibernate的criteria实现统计数量及多表查询
-
Easy Integration Testing with Spring+Hibernate
-
使用hibernate的criteria实现统计数量及多表查询
-
python-图像处理(映射变换)
-
EF(EntityFramework)与mysql使用,取数据报错,linq实体映射错误
-
Hibernate基础配置
-
一般企业开发中hibernate和ibatis哪个用的多?哪个更好?
-
Easy Integration Testing with Spring+Hibernate