Xml 方法

在student.hbm.xml中

<generator class="uuid"></generator>

取值如下

1、identity:用于MySql数据库。特点:递增

  1. <id name="id" column="id">
  2. < generator class="identity"/>
  3. </id>

注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。

2、sequence:用于Oracle数据库

  1. <id name="id" column="id">
  2. <generator class="sequence">
  3. <param name="sequence">序列名</param>
  4. </generator>
  5. </id>

3、native:跨数据库时使用,由底层方言产生。 
Default.sequence为hibernate_sequence

  1. <id name="id" column="id">
  2. <generator class="native"/>
  3. </id>

注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。 
如果Oracle中没有该序列,连Oracle数据库时会报错。

4、hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要有初始值。

  1. <id name="id" column="id">
  2. <generator class="hilo">
  3. <param name="table">high_val</param>
  4. <param name="column">nextval</param>
  5. <param name="max_lo">5</param>
  6. </generator>
  7. </id>

5、sequencehilo:同过高低位合成id,建一个sequence序列,不用建表。

  1. <id name="id" column="id">
  2. <generator class="hilo">
  3. <param name="sequence">high_val_seq</param>
  4. <param name="max_lo">5</param>
  5. </generator>
  6. </id>

6、assigned:用户自定义id;

  1. <id name="id" column="id">
  2. <generator class="assigned"/>
  3. </id>

7、foreign:用于一对一关系共享主健时,两id值一样。

本文讲解Hibernate中hbm的generator子元素的一些内置生成器的快捷名字。Generator子元素是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。

在*.hbm.xml必须声明的< generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识。

  1. <generator class="sequence"/>

这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然,Hibernate提供了很多内置的实现。下面是Generator子元素的一些内置生成器的快捷名字:

Annotation方法

package com.easy;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class student {
private int id;
private String name;
private int age;
@Id
@GeneratedValue
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;
} }

JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. 
TABLE:使用一个特定的数据库表格来保存主键。 
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 
IDENTITY:主键由数据库自动生成(主要是自动增长型) 
AUTO:主键由程序控制。

Annotation更改sequence名称

在类前加

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

指定触发器名称

@GeneratedValue(strategy = GenerationType.SEQUENCE,generator ="teacherSEQ" )

使用表生成id

在类前加

@javax.persistence.TableGenerator(
name="Teacher_GEN",
table="GENERATOR_TABLE",
pkColumnName = "pk_key",
valueColumnName = "pk_value",
pkColumnValue="Teacher",
allocationSize=
)
@GeneratedValue(strategy = GenerationType.table,generator ="teacherSEQ" )

联合主键

例如用id name作为联合主键

Xml方式

新建一个联合主键类 然后重写equals 和hashcode方法 保证在内存中寻找主键

package com.bjsxt.hibernate;

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;
} @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.java

package com.bjsxt.hibernate;

import javax.persistence.Id;

public class Student {

   private StudentPK pk;

    private int age;
private String sex;
private boolean good;
public boolean isGood() {
return good;
}
public void setGood(boolean good) {
this.good = good;
}
/*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 getId() {
return id;
}
public void setId(String id) {
this.id = id;
}*/
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public StudentPK getPk() {
return pk;
}
public void setPk(StudentPK pk) {
this.pk = pk;
} }

Test

@Test
public void testStudentSave() {
Student s = new Student();
StudentPK pk = new StudentPK(); pk.setId();
pk.setName("zhangsan"); s.setPk(pk);
s.setAge(); Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
}

2.annotation版本

有3种方式

第一种

在主键类上加

@Embeddable

然后在类生成

private TeacherPK pk; 并生成get set方法

然后在get上写@id

第二种

生成逐渐类后

private TeacherPK pk; 并生成get set方法

然后再get上写

@EmbeddedId

第三种

直接在getid 和getname上写@id

在类前加注释

@IdClass(TeacherPK.class)

Hibernate 再接触 ID生成策略的更多相关文章

  1. Hibernate系列之ID生成策略

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

  2. hibernate(四)ID生成策略

    一.ID生成策略配置 1.ID生成方式在xml中配置方式: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...

  3. hibernate 中id生成策略

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

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

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

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

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

  6. hibernate ID生成策略配置

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

  7. hibernate注解主键生成策略

    Id生成策略: @GeneratedValue,JPA通用策略生成器 . JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.  TABLE:使用一个特定的数据库表格来 ...

  8. 数据库主键ID生成策略

    前言: 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实现分库 ...

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

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

随机推荐

  1. jQuery实现评论弹幕、弹幕漂浮、滚动代码

    1.html代码和jquery代码: <!DOCTYPE html> <html> <head lang="en"> <meta char ...

  2. python装饰器(二)

    有参装饰器 def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函数之前要做的''') r ...

  3. Linux性能及调优指南1.2之Linux内存架构

    本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.2节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...

  4. es6基础(2)--解构赋值

    //解构赋值 { let a,b,rest; [a,b]=[1,2]; console.log(a,b); } //数组解构赋值 { let a,b,rest; [a,b,...rest]=[1,2, ...

  5. MyBatis批量增删改查操作

      前文我们介绍了MyBatis基本的增删该查操作,本文介绍批量的增删改查操作.前文地址:http://blog.csdn.net/mahoking/article/details/43673741 ...

  6. mac maven lombok报错

    maven已导入lombok的jar包,注解@Data,但是用到getter,setter时依然出错.解决办法: 打开eclipse.ini文件,加上如下两句: -Xbootclaspath//Use ...

  7. vue生命周期理解图

    ............................... 它可以总共分为8个阶段: beforeCreate(创建前), created(创建后), beforeMount(载入前), moun ...

  8. raw格式和qcow2格式

    Raw: "raw" 镜像格式是最最简单的,并且是被 KVM 和 Xen 原生支持的格式,你 可以想象裸格式镜像和块设备文件是二进制位相当的,就好像从块设备拷 贝过来的,比方说,使 ...

  9. python学习笔记_week24

    note 内容回顾: Model - 数据库操作 on_delete Query_set select_related 跨表数据一次性拿过来,不增加sql查询次数.帮助跨表,后面参数只能加连表字段 f ...

  10. IDEA Maven项目 编译的问题

    IDEA中,点击项目的maven插件的 compile: 出现: [INFO] ------------------------------------------------------------ ...