一、ID生成策略配置

1、ID生成方式在xml中配置方式:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.orlion.hibernate.model">
<class name="Student" table="student"><!-- 如果表名与类名相同可以不用写table属性 -->
<!-- 用id映射主键 -->
<id name="id"> <!-- 列名相同可以不指定column属性 -->
<generator class="native"></generator><!-- 在这里设置id生成方式 -->
</id> <property name="name" column="name"></property>
<property name="age"></property>
</class>
</hibernate-mapping>

2、ID用注解配置:

在ID注解下添加注解@generatedValue,只有四种方式,默认的策略是auto

配置方式:@genetatedValue(strategy=GenerationType.AUTO)

(1)AUTO - 相当于采用xml中native方式

(2)TABLE - 使用表保存id值

(3)IDENTITY - identity column

(4)SEQUENCE - sequence

在类名上添加注解@SequenceGenerator(name="teacherSEQ" , sequenceName="teacherSEQ_DB");定义sequence生成器,name属性指定的是生成器名字,sequenceName指定的是sequence名字

在getId()方法上添加注解@genetatoedValue(strategy=GenerationType.SEQUENCE , generator="teacherSEQ")表示采用sequence生成策略,采用生成器是teacherSEQ

二、ID主要生成策略

hibernate中id生成主要方式有:

(1)native:根据不同的数据库采用不同的ID生成方式,例如:在SQL Server中采用identity; 在MySQL中采用auto_increment; 在ORACLE中就会采用sequence。

(2)uuid:原理是使用128位的uuid算法产生主键,从而能够确保网络环境下的一致性。使用此生成策略时,实体类的主键是String类型的,映射成表中字段为varchar。适用所有数据库。

(3)identity:这种策略在采用SQL Server时,相当于SQL Server的identity关键字。

(4)sequence:在 Oracle中使用序列(sequence)。返回的标识符是long, short或者 int类型的。

三、联合主键

1、xml文件方式配置联合主键

单独建一个类作为主键类,以Student类为例,假设student有两个主键id和name,那么可以建一个主键类StudentPK,主键类中包含两个属性即student的两个主键,而且要实现Serializable接口,覆盖equals和hashCode方法:

package cn.orlion.hibernate.model;
// 实现Serializable接口
public class StudentPK implements java.io.Serializable{ private int id; private String name; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
// 覆盖equals方法
public boolean equals(Object o){ if (o instanceof StudentPK) {
StudentPK pk = (StudentPK)o;
return this.id == pk.getId() && this.name.equals(((StudentPK) o).getName());
} return false;
}
// 覆盖hashCode方法
public int hashCode(){
return this.name.hashCode();
}
}

这时Student应该去掉int和name属性然后加上StudentPK属性,如下:

package cn.orlion.hibernate.model;

public class Student {

    private StudentPK spk;

//    private int id;
//
// private String name; public StudentPK getSpk() {
return spk;
} public void setSpk(StudentPK spk) {
this.spk = spk;
} private int age; // public int getId() {
// return id;
// }
//
// public void setId(int id) {
// this.id = id;
// }
//
// public String getName() {
// return name;
// }
//
// public void setName(String name) {
// this.name = name;
// } public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

然后修改配置文件为:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.orlion.hibernate.model">
<class name="Student" table="student"><!-- 如果表名与类名相同可以不用写table属性 -->
  
     <!-- 在这里修改主键配置 -->
<composite-id name="spk" class="cn.orlion.hibernate.model.StudentPK">
<key-property name="id"></key-property>
<key-property name="name"></key-property>
</composite-id> <property name="age"></property>
</class>
</hibernate-mapping>

这样往数据库中插入一条数据就应该下new一个StudentPK,然后再new一个Student对象:

StudentPK spk = new StudentPK();
spk.setId(1);
spk.setName("test1");
Student t = new Student();
t.setSpk(spk);
// t.setName("test1");
t.setAge(1); Session session = sf.openSession(); session.beginTransaction();
session.save(t);
session.getTransaction().commit(); session.close();

2、注解方式配置联合主键

共有三种方式:

(1)将组件类注解为@Embeddable,并将组件的属性注解为@ID

具体过程:

创建组件类:TeacherPK(实现serializable接口,覆盖equals和hashCode方法)

package cn.orlion.hibernate.model;

import javax.persistence.Embeddable;

@Embeddable
public class TeacherPK implements java.io.Serializable{ private int id; private String name; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
// 覆盖equals方法
public boolean equals(Object o){ if (o instanceof StudentPK) {
StudentPK pk = (StudentPK)o;
return this.id == pk.getId() && this.name.equals(((StudentPK) o).getName());
} return false;
}
// 覆盖hashCode方法
public int hashCode(){
return this.name.hashCode();
}
}

然后Teacher类:(注释掉id和name属性,添加TeacherPK属性,并加上注解@Id)

package cn.orlion.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id; @Entity
public class Teacher{ private TeacherPK tpk; // private int id;
//
// private String name;
@Id
public TeacherPK getTpk() {
return tpk;
} public void setTpk(TeacherPK tpk) {
this.tpk = tpk;
} private String title;
// @Id
// @GeneratedValue(strategy = GenerationType.AUTO)
// public int getId() {
// return id;
// }
//
// public void setId(int id) {
// this.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;
}
}

保存teacher对象的时候:

TeacherPK tpk = new TeacherPK();
tpk.setId(1);
tpk.setName("test1");
Teacher t = new Teacher();
t.setTpk(tpk);
// t.setName("test2");
t.setTitle("title1"); Session session = sf.openSession(); session.beginTransaction();
session.save(t);
session.getTransaction().commit(); session.close();

可以看到建表:

(2)在组件属性添加注解@EmbeddedId

具体为:去掉TeacherPK类上的注解@Embeddable,然后在Teacher类中的getTpk()方法上的注解由@Id改为@EmbeddedId

(3)将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id

具体:

修改Teacher类为:(注:id生成策略设为AUTO的时候会在TeacherPK的setId()方法上抛出一个异常IllegalArgumentException,"POST_INSERT_INDICATOR")

package cn.orlion.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.IdClass; @Entity
@IdClass(TeacherPK.class)
public class Teacher{ private int id; private String name; private String title;
@Id
public int getId() {
return id;
} public void setId(int 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;
}
}

TeacherPK:

package cn.orlion.hibernate.model;

public class TeacherPK implements java.io.Serializable{

    private int id;

    private String name;

    public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
// 覆盖equals方法
public boolean equals(Object o){ if (o instanceof StudentPK) {
StudentPK pk = (StudentPK)o;
return this.id == pk.getId() && this.name.equals(((StudentPK) o).getName());
} return false;
}
// 覆盖hashCode方法
public int hashCode(){
return this.name.hashCode();
}
}

保存Teacher对象的时候:

Teacher t = new Teacher();
t.setName("test1");
t.setId(1);
t.setTitle("title1"); Session session = sf.openSession(); session.beginTransaction();
session.save(t);
session.getTransaction().commit(); session.close();

hibernate(四)ID生成策略的更多相关文章

  1. hibernate 中id生成策略

    数据库的设计和操作中,我们通常会给表建立主键. 主键,可以分为自然主键和代理主键. 自然主键表示:采用具有业务逻辑含义的字段作为表的主键.比如在用户信息表中,采用用户的身份证号码作为主键.但是这样一来 ...

  2. hibernate的id生成策略

    欢迎转载,请注明出处http://www.cnblogs.com/shizhongtao/p/3436523.html 一.xml配置方式的id生成 <id name="id" ...

  3. Hibernate学习笔记2.4(Hibernate的Id生成策略)

    通过设置告诉id该怎么设置. 1.通过xml方式 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据 ...

  4. Hibernate系列之ID生成策略

    一.概述 hibernate中使用两种方式实现主键生成策略,分别是XML生成id和注解方式(@GeneratedValue),下面逐一进行总结. 二.XML配置方法 这种方式是在XX.hbm.xml文 ...

  5. Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略

    Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. @Test publ ...

  6. [Hibernate开发之路](4)ID生成策略

    一 对象关系数据库映射之Id 被映射的类必须定义相应数据库表主键字段.大多数类有一个JavaBeans风格的属性, 为每个实例包括唯一的标识. <id> 元素定义了该属性到数据库表主键字段 ...

  7. hibernate ID生成策略配置

    1.Student.hbm.xml配置 <hibernate-mapping package="com.wxh.hibernate.model"> <class ...

  8. 基于按annotation的hibernate主键生成策略

    基于按annotation的hibernate主键生成策略 博客分类: Hibernate HibernateJavaJPAOracleMySQL  这里讨论代理主键,业务主键(比如说复合键等)这里不 ...

  9. JPA ID生成策略(转---)

    尊重原创:http://tendyming.iteye.com/blog/2024985 JPA ID生成策略 @Table Table用来定义entity主表的name,catalog,schema ...

随机推荐

  1. SAP DataServices企业定制培训

    No. Item Remark 1 Dataservices overview DS概述 2 SAP Dataservices 安装与配置 DS的配置 3 DS ETL开发<1> for ...

  2. 张洋:浅析PageRank算法

    本文引自http://blog.jobbole.com/23286/ 很早就对Google的PageRank算法很感兴趣,但一直没有深究,只有个轮廓性的概念.前几天趁团队outing的机会,在动车上看 ...

  3. Android中的requestWindowFeature

    朋友推荐使用博客记录工作中的难点以及常犯的错误,仅作为笔记,首先整理之前的工作日志. requestWindowFeature(featrueId),它的功能是启用窗体的扩展特性: 注意:该方法必须放 ...

  4. iOS -- 透明H5(webView)效果的实现

    前几天有一个完全透明的webView加载H5页面的效果的实现,就相当于是一个半透明的遮罩层,上面有一个不透明的图片,一般原生的带遮罩层的弹框会采用这种方式,如果是原生代码实现,就简单的多了,视图的叠加 ...

  5. 5.webService拦截器

    CXF为什么要设计拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. 拦截器分类 1.按所处的位置分:服务器端拦截器,客户端拦截器 2.按消息的方向分:入 ...

  6. 将图片在指定窗口中显示-OpenCV应用学习笔记一

    1.OpenCV模块划分 OpenCV其实就是一堆用C和C++语言来实现计算机视觉算法的源代码文件:例如C接口函数cvCany()实现了Canny边缘提取算法,我们可以直接将这些源代码添加到自己的软件 ...

  7. java分割字符串

    经验分享: 1.分隔符为“.”(无输出),“|”(不能得到正确结果)转义字符时,“*”,“+”时出错抛出异常,都必须在前面加必须得加"\\",如split(\\|); 2.如果用& ...

  8. spark on centos6.5 安装

    第一步在centos 6.5上安装java 运行环境 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18 ...

  9. 【转载】关于.NET里的内存泄漏

    所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中..Net 中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉.虽然.N ...

  10. 完美实现类似QQ的自拍头像、上传头像功能!(Demo 源码)

    现在很多下载客户端程序都需要设定自己头像的功能,而设定头像一般有两种方式:使用摄像头自拍头像,或者选择一个图片的某部分区域作为自己的头像. 一.相关技术 若要实现上述的自拍头像和上传头像的功能,会碰到 ...