Hibernate的主键的生成策略
2017-02-01 14:52
351 查看
主键生成机制
increment 标识符生成器
1.配置Person.hbm.xml文件
2.配置hibernate.cfg.xml文件
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- 是用来描述数据库的连接 --> <session-factory> <!-- 驱动 --> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- url --> <property name="connection.url"> jdbc:mysql://localhost:3306/hibernate0909 </property> <!-- username --> <property name="connection.username">root</property> <!-- password --> <property name="connection.password">123</property> <!-- hibernate针对建表的操作 update 如果有表,检查表的结构,如果没有则创建 create-drop 启动hibernate创建表,结束hibernate删除表 create 每次启动都重新创建表 validate 每次启动都检查表的结构 --> <property name="hbm2ddl.auto">update</property> <!-- 在控制台显示sql语句 --> <property name="show_sql">true</property> <mapping resource="cn/itcast/hibernate0909/idgenerator/increment/Person.hbm.xml" /> </session-factory> </hibernate-configuration>
3.测试increment 标识符生成器
package cn.itcast.hibernate0909.idgenerator.increment; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; public class IncrementTest { private static SessionFactory sessionFactory; static{ Configuration configuration = new Configuration(); configuration.configure("cn/itcast/hibernate0909/idgenerator/increment/hibernate.cfg.xml"); sessionFactory = configuration.buildSessionFactory(); } /* * Hibernate: select max(pid) from person Hibernate: insert into person (pname, psex, pid) values (?, ?, ?) increment hibernate内部会去查询该表中的主键的最大值,然后把最大值加1 */ @Test public void testSavePerson(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = new Person(); person.setPname("菜肉"); person.setPsex("男性"); session.save(person); transaction.commit(); session.close(); } }
4.Junit测试结果
5.小结
increment 标识符生成器increment 标识符生成器由 Hibernate 以递增的方式为代理主键赋值
Hibernate 会先读取 NEWS 表中的主键的最大值, 而接下来向 NEWS 表中插入记录时, 就在 max(id) 的基础上递增,
增量为 1.(带走+1)
适用范围:
由于 increment 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统
适用于只有单个 Hibernate 应用进程访问同一个数据库的场合
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
identity 标识符生成器
ps:先删除原先的数据库表1.配置Person.hbm.xml文件
2.配置hibernate.cfg.xml文件
如上配置,导入配置Person.hbm.xml文件3.测试identity标识符生成器
package cn.itcast.hibernate0909.idgenerator.identity; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; public class IdentityTest { private static SessionFactory sessionFactory; static{ Configuration configuration = new Configuration(); configuration.configure("cn/itcast/hibernate0909/idgenerator/identity/hibernate.cfg.xml"); sessionFactory = configuration.buildSessionFactory(); } /** * Hibernate: insert into person (pname, psex) values (?, ?) * 因为没有发出select max语句,所以identity的效率比increment要高 * 主键不连贯 */ @Test public void testSavePerson(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = new Person(); person.setPname("wren"); person.setPsex("女"); session.save(person); transaction.commit(); session.close(); } }
4.Junit测试结果
5.小结
identity 标识符生成器identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型(加1带走)
适用范围:
由于 identity 生成标识符的机制依赖于底层数据库系统, 因此, 要求底层数据库系统必须支持自动增长字段类型.支持自动增长字段类型的数据库包括: DB2, Mysql, MSSQLServer, Sybase 等
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
sequence 标识符生成器
sequence 标识符生成器利用底层数据库提供的序列来生成标识符.Hibernate 在持久化一个 News 对象时, 先从底层数据库的 news_seq 序列中获得一个唯一的标识号, 再把它作为主键值
适用范围:
由于 sequence 生成标识符的机制依赖于底层数据库系统的序列, 因此, 要求底层数据库系统必须支持序列. 支持序列的数据库包括:
DB2 Oracle 等
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
native 标识符生成器
native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo标识符生成器.
适用范围:
由于 native 能根据底层数据库系统的类型, 自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
assigned 标识符生成器
1.配置Person.hbm.xml文件
2.配置hibernate.cfg.xml文件
3.测试assigned 标识符生成器
package cn.itcast.hibernate0909.idgenerator.assigned; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; public class AssignedTest { private static SessionFactory sessionFactory; static{ Configuration configuration = new Configuration(); configuration.configure("cn/itcast/hibernate0909/idgenerator/assigned/hibernate.cfg.xml"); sessionFactory = configuration.buildSessionFactory(); } @Test public void testSavePerson(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = new Person(); person.setPid(5L); person.setPname("cairou"); person.setPsex("男"); session.save(person); transaction.commit(); session.close(); } }
4.Junit测试结果
5.小结
assigned 标识符生成器hibernate和底层数据库都不帮助你生成主键,也就是说得自己在程序中手动的设置主键的值。
适用范围:
主键有一定的含义,需要根据业务产生的情况。
Uuid标识符生成器
1.配置Person.hbm.xml文件
2.配置hibernate.cfg.xml文件
3.测试uuid标识符生成器
package cn.itcast.hibernate0909.idgenerator.uuid; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; public class UUIDTest { private static SessionFactory sessionFactory; static{ Configuration configuration = new Configuration(); configuration.configure("cn/itcast/hibernate0909/idgenerator/uuid/hibernate.cfg.xml"); sessionFactory = configuration.buildSessionFactory(); } @Test public void testSavePerson(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = new Person(); person.setPname("cc"); person.setPsex("男性"); session.save(person); transaction.commit(); session.close(); } }
4.Junit测试结果
5.小结
Uuid标识符生成器Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间
使用范围:
主键是字符串,而且必须是唯一
相关文章推荐
- Hibernate 生成主键的几种策略
- hibernate 主键生成策略介绍
- Hibernate 主键生成策略
- 扩展hibernate的主键生成策略
- hibernate主键生成策略(2)
- Hibernate 主键生成策略
- Hibernate 的三种主键生成策略
- hibernate主键生成策略之sequence
- hibernate笔记(三) Hibernate标识符属性(主键)生成策略全析
- hibernate 主键 生成策略详解
- 基于annotation的hibernate主键生成策略
- 基于按annotation的hibernate主键生成策略
- hibernate 主键生成策略解释--通俗易懂
- Hibernate 学习笔记-1-3(Hibernate的基本映射以及几种主键生成策略的测试)
- hibernate主键的生成策略
- Hibernate 主键生成策略
- 基于按annotation的hibernate主键生成策略
- Hibernate 主键生成策略
- hibernate主键生成策略(1)
- hibernate 主键生成策略