increment:主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用;

1)identity:

    采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。

2)sequence

    采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。

3)hilo

    hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。

4)seqhilo

    与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。

5)uuid.hex

    由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。(跨数据库)

6)uuid.hex

    由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。(跨数据库)

7)guid

    很少用;

8)native

    根据数据库选择自动递增算法,常用;(跨数据库)

9)assigned

    主键由外部程序负责生成,无需hibernate参与;

10)select

    很少用;

11)foreign

    使用外部表的字段作为主键。

12)sequence-identity 很少用;

13)increment

    主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。

  一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。

  另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。

  hibernate 的说明如下:

    不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。

路径:hibernate-distribution-3.3.2.GA/documentation/manual/zh-CN/html_single/index.html#mapping-declaration-id

截图:

uuid XML 配置:

       <id name="id" column="id">
<generator class="uuid"/>
</id>

对应的JavaBean用String类型:

     private String id;
public String getId() {
return id;
} public void setId(String id) {
this.id = id;
}

native XML 配置:

        <id name="id" column="id">
<generator class="native"/>
</id>

对应的JavaBean用Integer/int类型:

     private Integer id;
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
}

用 MySQL 数据库,hibernate自动生成的建_student表的语句:

连接Oracle数据库进行测试:

1、重新在 hibernate.cfg.xml文件中修改Oracle的连接配置,具体配置驱动、url、username、password的配置参考:

hibernate-distribution-3.3.2.GA\project\etc\hibernate.properties

2、java bean的属性配置要符合oracle表和字段的命名规范;

3、ID 配置:

  XML 的跟上面的一样;

  注解:默认就是AUTO(相当于native),可以不用写,此时ID生成的sequence是hibernate_sequence;

       还有 IDENTITY(只能用在MySQL和SQL Server等支持IDENTITY的数据库中,Oracle就用不了)、SEQUENCE、TABLE

  @Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() {
return id;
}

3.1、如果要为 model ID 指定确定的sequence,而不是去用默认的 hibernate_sequence,配置如下:

  注解:

    model头:name 表示这个sequence生成器的名字,sequenceName 是指明序列在数据库中的名字

@Entity
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")

    ID上的配置:

    

  @Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
public Integer getId() {
return id;
}

  XML:在 hibernate.cfg.xml 中的配置

 <hibernate-mapping>
<class name="..." table="..." schema="...">
<id name="userId" type="java.lang.Integer">
<column name="USER_ID" precision="9" scale="0" />
<generator class="sequence">
<param name="sequence">Student_SEQ</param>
</generator>
</id>
<property ... />
</class>
</hibernate-mapping>

  3.2、复杂一点的主键生成器——TableGenerator    

     @javax.persistence.TableGenerator(
name="Teacher_GEN",//生成器名
table="GENERATOR_TABLE",//表名
pkColumnName = "pk_key",//第一个字段,key值
valueColumnName = "pk_value",//第二个字段,value值
pkColumnValue="Teacher",//一条记录的第一个字段
allocationSize=1//增量
)
@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN")
public Integer getId() {
return id;
}

初次使用该生成器,生成器找到对应的记录,返回value值1,同时value加上对应的增量。

  3.3 联合主键

    XML:一个表中的两个字段做主键,例子中取Student中的id、name做主键,创建一个StudentPK做主键类,在Student中配置好联合主键

Student

package com.bjsxt.hibernate;

public class Student {

    private StudentPK pk;

    private Integer age;

    public StudentPK getPk() {
return pk;
} public void setPk(StudentPK pk) {
this.pk = pk;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} }

StudentPK 需要实现Serializable接口,重写hashCode()和equals()方法

 package com.bjsxt.hibernate;

 import java.io.Serializable;

 public class StudentPK implements Serializable{

     private static final long serialVersionUID = -7950018142709463675L;

     private Integer id;

     private String name;

     public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public boolean equals(Object o) {
if(o instanceof StudentPK){
StudentPK pk = (StudentPK)o;
if(this.id == pk.getId() && this.name.equals(pk.getName())){
return true;
}
}
return false;
} @Override
public int hashCode() {
return this.name.hashCode();
}
}

Student.hbm.xml

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.bjsxt.hibernate">
<class name="Student" table="student">
<composite-id name="pk" class="com.bjsxt.hibernate.StudentPK">
<key-property name="id" />
<key-property name="name" />
</composite-id>
<property .../>
</class>
</hibernate-mapping>

插入操作:

   @Test
public void testStudentSave(){
StudentPK pk = new StudentPK();
pk.setId(1);
pk.setName("zhangsan");
Student s = new Student();
s.setPk(pk);
...
}

    Annotation:

      第一种方法:将组件类注解为@Embeddable,并将组件的属性注解为@Id;

      第二种方法:将组件的属性注解为@EmbeddedId;

      第三种方法:将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id;

      3种方法的主键类同样要需要实现Serializable接口,重写hashCode()和equals()方法。

        第一种方法例子:

TeacherPK

 package com.bjsxt.hibernate;

 import java.io.Serializable;

 @Embeddable
public class TeacherPK implements Serializable{ private static final long serialVersionUID = -3972276136768456123L; private Integer id; private String name; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public boolean equals(Object o) {
if(o instanceof StudentPK){
StudentPK pk = (StudentPK)o;
if(this.id == pk.getId() && this.name.equals(pk.getName())){
return true;
}
}
return false;
} @Override
public int hashCode() {
return this.name.hashCode();
} }

Teacher

 package com.bjsxt.hibernate;

 import java.util.Date;

 import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType; @javax.persistence.TableGenerator(
name="Teacher_GEN",//生成器名
table="GENERATOR_TABLE",//表名
pkColumnName = "pk_key",//第一个字段,key值
valueColumnName = "pk_value",//第二个字段,value值
pkColumnValue="Teacher",//记录值
allocationSize=1//增量
) @Entity
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
public class Teacher {
private TeacherPK pk; private String title; private Date birthday; private ZhiCheng zhicheng; public String getTitle() {
return title;
} @Id
public TeacherPK getPk() {
return pk;
} public void setPk(TeacherPK pk) {
this.pk = pk;
} public void setTitle(String title) {
this.title = title;
} @Temporal(TemporalType.DATE)
public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Enumerated(value=EnumType.STRING)
public ZhiCheng getZhicheng() {
return zhicheng;
} public void setZhicheng(ZhiCheng zhicheng) {
this.zhicheng = zhicheng;
} }

      第二种方法例子:

TeacherPK

 package com.bjsxt.hibernate;

 import java.io.Serializable;

 public class TeacherPK implements Serializable{

     private static final long serialVersionUID = -3972276136768456123L;

     private Integer id;

     private String name;

     public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public boolean equals(Object o) {
if(o instanceof StudentPK){
StudentPK pk = (StudentPK)o;
if(this.id == pk.getId() && this.name.equals(pk.getName())){
return true;
}
}
return false;
} @Override
public int hashCode() {
return this.name.hashCode();
} }

Teacher

 package com.bjsxt.hibernate;

 import java.util.Date;

 import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType; @javax.persistence.TableGenerator(
name="Teacher_GEN",//生成器名
table="GENERATOR_TABLE",//表名
pkColumnName = "pk_key",//第一个字段,key值
valueColumnName = "pk_value",//第二个字段,value值
pkColumnValue="Teacher",//记录值
allocationSize=1//增量
) @Entity
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
public class Teacher {
private TeacherPK pk; private Integer id; private String name; private String title; private Date birthday; private ZhiCheng zhicheng; public void setName(String name) {
this.name = name;
} public String getTitle() {
return title;
} @EmbeddedId
public TeacherPK getPk() {
return pk;
} public void setPk(TeacherPK pk) {
this.pk = pk;
} public void setTitle(String title) {
this.title = title;
} @Temporal(TemporalType.DATE)
public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Enumerated(value=EnumType.STRING)
public ZhiCheng getZhicheng() {
return zhicheng;
} public void setZhicheng(ZhiCheng zhicheng) {
this.zhicheng = zhicheng;
} }

    第三种方法例子:

TeacherPK

 package com.bjsxt.hibernate;

 import java.io.Serializable;

 public class TeacherPK implements Serializable{

     private static final long serialVersionUID = -3972276136768456123L;

     private Integer id;

     private String name;

     public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public boolean equals(Object o) {
if(o instanceof StudentPK){
StudentPK pk = (StudentPK)o;
if(this.id == pk.getId() && this.name.equals(pk.getName())){
return true;
}
}
return false;
} @Override
public int hashCode() {
return this.name.hashCode();
} }

Teacher

 package com.bjsxt.hibernate;

 import java.util.Date;

 import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType; @javax.persistence.TableGenerator(
name="Teacher_GEN",//生成器名
table="GENERATOR_TABLE",//表名
pkColumnName = "pk_key",//第一个字段,key值
valueColumnName = "pk_value",//第二个字段,value值
pkColumnValue="Teacher",//记录值
allocationSize=1//增量
) @Entity
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
@IdClass(StudentPK.class)
public class Teacher {
private Integer id; private String name; private String title; private Date birthday; private ZhiCheng zhicheng; @Id
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Id
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} @Temporal(TemporalType.DATE)
public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Enumerated(value=EnumType.STRING)
public ZhiCheng getZhicheng() {
return zhicheng;
} public void setZhicheng(ZhiCheng zhicheng) {
this.zhicheng = zhicheng;
} }

链接: http://pan.baidu.com/s/1qYayZk4 密码: ta5c

所需jar包链接: http://pan.baidu.com/s/1hr35oVU 密码: yhsf

最新文章

  1. [资料分享]尚硅谷JavaWeb
  2. LogNet4日志框架使用
  3. J2EE 第二阶段项目之编写代码(四)
  4. Ztree实现带checkBox的下拉框
  5. (笔记)angular 单选选项卡
  6. sk_buff
  7. C语言 字符串和数字转换函数
  8. [转]Hadoop YARN任务提交流程
  9. QT 强止杀进程
  10. Codeforces 374D Inna and Sequence 二分法+树状数组
  11. 解析SS、SP、BP寄存器
  12. XHR
  13. Oracle中的decode()函数
  14. python实例七
  15. 区别:ASP.NET MVC的Model、DTO、Command
  16. ThreadPoolExecutor线程池详解
  17. Linux与Windows串口通信
  18. 数据结构之二叉搜索树、AVL自平衡树
  19. atitit.网络文件访问协议.unc&#160;smb&#160;nfs&#160;ftp&#160;http的区别
  20. IOS XMPP(即时通讯的框架)

热门文章

  1. mysql 查询月份数据.
  2. 关于Manjaro与Ubuntu双系统并存引发的一个boot问题
  3. c3m快速入门
  4. Myeclipse经常弹出Subversion Native Library Not Available
  5. 给JFinal添加 Sqlite 数据库支持
  6. Oracle分组函数之CUBE魅力
  7. ngin日志格式
  8. yum lnmp全家桶
  9. (转) shell实例手册
  10. 01-struts2配置详解