Hibernate——(3)主键生成方式

来源:互联网 发布:魅可mac什么档次 编辑:程序博客网 时间:2024/04/30 16:00

一、Hibernate中常用的主键生成方式有如下几种:

1)identity: 用于自动生成主键方式,除了 Oracle 不支持,其他数据库一般都支持(较常用)

2)sequence: Oracle 中使用,用序列生成 ID 主键

3)native: 主键生成方式如果是 native,那就看配置文件 hibernate.cfg.xml 中方言<property name="dialect">是什么,如果方言是 Mysql,相当于 identity,如果方言是 Oracle,相当于 sequence

4)increment: 不常用

5)assigned: 不常用,手动生成 id

二、案例:5种主键生成方式演示

1、项目结构

2、新建Foo:用于测试的POJO

  1. <strong><span style="font-family:FangSong_GB2312;font-size:14px;">package com.xsyu.tts.po;  
  2.   
  3. public class Foo {  
  4.     private Integer id;  
  5.     private String value;  
  6.   
  7.     public Integer getId() {  
  8.         return id;  
  9.     }  
  10.   
  11.     public void setId(Integer id) {  
  12.         this.id = id;  
  13.     }  
  14.   
  15.     public String getValue() {  
  16.         return value;  
  17.     }  
  18.   
  19.     public void setValue(String value) {  
  20.         this.value = value;  
  21.     }  
  22. }</span></strong>  
  • identity:使用最频繁,除了Oracle,其他数据库一般都有

3、数据库表t_foo:主键生成方式为自动生成主键

  1. <strong><span style="font-family:FangSong_GB2312;font-size:14px;">DROP TABLE IF EXISTS t_foo;  
  2. CREATE TABLE t_foo (  
  3. t_id int(11) NOT NULL AUTO_INCREMENT,  
  4. t_value varchar(50) NOT NULL,  
  5. PRIMARY KEY (t_id)  
  6. ) ENGINE=InnoDB;</span></strong>  

4、新建Foo.hbm.xml:如果数据库支持自动生成主键方式,则可以使用identity, mysql数据库常用此方式。

  1. <strong><span style="font-family:FangSong_GB2312;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.tarena.tts.po">  
  6.     <class name="Foo" table="t_foo">  
  7.         <id name="id" type="java.lang.Integer" column="t_id">  
  8.             <!-- 用来指明主键的生成方式 -->  
  9.             <generator class="identity"></generator>  
  10.         </id>  
  11.         <property name="value" type="java.lang.String" column="t_value" />  
  12.     </class>  
  13. </hibernate-mapping></span></strong>  
5、hibernate.cfg.xml中进行配置
  1. <strong><span style="font-family:FangSong_GB2312;font-size:14px;"><mapping resource="com/xsyu/tts/po/Foo.hbm.xml" /></span></strong>  
6、新建TestPersistence

  1. <strong><span style="font-family:FangSong_GB2312;font-size:14px;">public class TestPersistence {  
  2.     /** 
  3.      * 用于测试Hibernate主键生成方式 主键生成方式: identity sequence native 
  4.      */  
  5.     @Test  
  6.     public void testGenerator() {  
  7.         Session session = HibernateUtils.openSession();  
  8.         Transaction tx = session.beginTransaction();  
  9.         // identity  
  10.         // 不需要指定id  
  11.         Foo foo = new Foo();  
  12.         foo.setValue("foo_value1");  
  13.         session.save(foo);  
  14.         tx.commit();  
  15.         session.close();  
  16.     }  
  17. }  
  18. </span></strong>  
7、测试


8、查询数据库


  • sequence:Oracle数据库常用

9、创建Oracle数据库表并创建生成ID的sequence


10、修改配置文件hibernate.cfg.xml :修改成Oracle数据库的

  1. <strong><span style="font-family:FangSong_GB2312;font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5. <hibernate-configuration>  
  6.     <session-factory>  
  7.         <!-- 数据库连接信息 -->  
  8.         <property name="connection.url">  
  9.             jdbc:oracle:thin:@192.168.0.26:1521:tarena  
  10.         </property>  
  11.         <property name="connection.username">openlab</property>  
  12.         <property name="connection.password">open123</property>  
  13.         <property name="connection.driver_class">  
  14.             oracle.jdbc.driver.OracleDriver  
  15.         </property>  
  16.         <!-- Hibernate配置信息 -->  
  17.         <!-- dialect方言,用亍配置生成针对哪个数据库的SQL语句 -->  
  18.         <property name="dialect">  
  19.             <!--方言类,Hibernate提供的,用亍封装某种特定数据库的方言 -->  
  20.             org.hibernate.dialect.OracleDialect  
  21.         </property>  
  22.         <property name="hibernate.show_sql">true</property>  
  23.         <!-- 在配置文件中关联映射文件 -->  
  24.         <mapping resource="com/xsyu/tts/po/User.hbm.xml" />  
  25.         <mapping resource="com/xsyu/tts/po/Foo.hbm.xml" />  
  26.     </session-factory>  
  27. </hibernate-configuration></span></strong>  
11、修改映射文件Foo.hbm.xml :修改为sequence方式连接
  1. <strong><span style="font-family:FangSong_GB2312;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.tarena.tts.po">  
  6.     <class name="Foo" table="t_foo">  
  7.         <id name="id" type="java.lang.Integer" column="t_id">  
  8.             <!-- 用来指明主键的生成方式 -->  
  9.             <generator class="sequence">  
  10.                 <param name="sequence">foo_seq</param>  
  11.             </generator>  
  12.         </id>  
  13.         <property name="value" type="java.lang.String" column="t_value" />  
  14.     </class>  
  15. </hibernate-mapping></span></strong>  
12、测试


13、查看数据库


  • native :native根据配置文件的方言选择是identity还是squence

  1. <strong><span style="font-family:FangSong_GB2312;font-size:14px;"><!-- 用来指明主键的生成方式 -->  
  2. <generator class="native">  
  3.     <param name="sequence">foo_seq</param>  
  4. </generator></span></strong>  

如果是 mysql 数据库,
<param name="sequence">foo_seq</param>是不起作用的,但也不会出错;
如果是 oracle 数据库,
<param name="sequence">foo_seq</param>就会起作用,
所以一般我们会加上这句话,这样通用性更强。
  • increment :不常用,如果主键生成方式为increment 

新建数据库表t_foo时不需要写“auto_increment"


插入数据时,同样也不需要指定ID


查看控制台,Hibernate执行了2条SQL

increment生成主键的方式是先“select max(t_id) from t_foo",从t_foo中找到最大的id,之后将max(t_id)加1,这样就保证了主键唯一。但是这样也有风险,当并发访问时会有风险。不建议使用。

  • assigned: 没有任何自动方式,需要用户自己指定,使用也较少

设置主键为assigned


必须手动设置ID

0 0
原创粉丝点击