Hibernate 再接触 ID生成策略
Xml 方法
在student.hbm.xml中
<generator class="uuid"></generator>
取值如下
1、identity:用于MySql数据库。特点:递增
- <id name="id" column="id">
- < generator class="identity"/>
- </id>
注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。
2、sequence:用于Oracle数据库
- <id name="id" column="id">
- <generator class="sequence">
- <param name="sequence">序列名</param>
- </generator>
- </id>
3、native:跨数据库时使用,由底层方言产生。
Default.sequence为hibernate_sequence
- <id name="id" column="id">
- <generator class="native"/>
- </id>
注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。
如果Oracle中没有该序列,连Oracle数据库时会报错。
4、hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要有初始值。
- <id name="id" column="id">
- <generator class="hilo">
- <param name="table">high_val</param>
- <param name="column">nextval</param>
- <param name="max_lo">5</param>
- </generator>
- </id>
5、sequencehilo:同过高低位合成id,建一个sequence序列,不用建表。
- <id name="id" column="id">
- <generator class="hilo">
- <param name="sequence">high_val_seq</param>
- <param name="max_lo">5</param>
- </generator>
- </id>
6、assigned:用户自定义id;
- <id name="id" column="id">
- <generator class="assigned"/>
- </id>
7、foreign:用于一对一关系共享主健时,两id值一样。
本文讲解Hibernate中hbm的generator子元素的一些内置生成器的快捷名字。Generator子元素是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。
在*.hbm.xml必须声明的< generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识。
- <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生成策略的更多相关文章
- Hibernate系列之ID生成策略
一.概述 hibernate中使用两种方式实现主键生成策略,分别是XML生成id和注解方式(@GeneratedValue),下面逐一进行总结. 二.XML配置方法 这种方式是在XX.hbm.xml文 ...
- hibernate(四)ID生成策略
一.ID生成策略配置 1.ID生成方式在xml中配置方式: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...
- hibernate 中id生成策略
数据库的设计和操作中,我们通常会给表建立主键. 主键,可以分为自然主键和代理主键. 自然主键表示:采用具有业务逻辑含义的字段作为表的主键.比如在用户信息表中,采用用户的身份证号码作为主键.但是这样一来 ...
- Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略
Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. @Test publ ...
- [Hibernate开发之路](4)ID生成策略
一 对象关系数据库映射之Id 被映射的类必须定义相应数据库表主键字段.大多数类有一个JavaBeans风格的属性, 为每个实例包括唯一的标识. <id> 元素定义了该属性到数据库表主键字段 ...
- hibernate ID生成策略配置
1.Student.hbm.xml配置 <hibernate-mapping package="com.wxh.hibernate.model"> <class ...
- hibernate注解主键生成策略
Id生成策略: @GeneratedValue,JPA通用策略生成器 . JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. TABLE:使用一个特定的数据库表格来 ...
- 数据库主键ID生成策略
前言: 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实现分库 ...
- JPA ID生成策略(转---)
尊重原创:http://tendyming.iteye.com/blog/2024985 JPA ID生成策略 @Table Table用来定义entity主表的name,catalog,schema ...
随机推荐
- 01-配置java开发环境
JDK 1.8软件下载地址 (Oracle公司的官方网站) http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads ...
- 腾讯微信被怼,iOS版微信不能打赏了
2017年4月19日,估计很多有着大量粉丝的微信自媒体作者会感到很不爽,因为他们的苹果粉丝再也无法很爽快地.肆意.任性地打赏他们了,按目前iphone手机的占有率,估计打赏率会掉一半以上. 据微信派微 ...
- Solr进阶之Solr综合文本相似度的多因素权重排序实现
现在有个需求是这样子的:需要计算搜索词的权重设置其为总排序权重的0.6,其他因素的权重为0.4其他因素中还有详细的划分.这里我们用Solr如何来实现?众所周知solr默认的排序方式为按照文本相似度来进 ...
- LInux下的jdk环境置
1.Linux下使用wget下载jdk8: 进入目录/usr/local/software 2.解压 tar -zxvf jdk-8u152-linux-x64.tar.gz 3.配置环境变量 vi ...
- RPM软件管理工具
1 概述 RPM(RedHat Package Manager),Rethat软件包管理工具,类似windows里面的setup.exe 是Linux这系列操作系统里面的打包安装工具,它虽然是RedH ...
- iOS跳转洁面时隐藏tabBar的方法
//1.设置self.tabBarController.tabBar.hidden=YES; self.tabBarController.tabBar.hidden=YES; //2. ...
- uva-10954-贪心
题意:俩个数相加,产生的和就是这次加法的代价,问,所有数都加起来,最小代价是多少 解题思路:贪心,每次都选取最小俩个数相加,如果只有一个数,计算完毕,注意,加法的和要再次入队列. #include & ...
- uva10603-倒水问题-暴力枚举-隐式图搜索
题意: 给你三个杯子,a,b,c,没有刻度,刚开始c杯是满的,倒水的要求,要么倒出水的杯子倒空,要么倒入杯子倒满. 结果: 要求某个杯子内有d水量,并且倒出的水量最少,如果倒不出d水量,那么倒出d1( ...
- 用javascript控制svg的图片颜色
SVG:(1.svg) <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC ...
- kotlin学习(二)——类
Kotlin中的类遵循一个简单的结构.尽管与Java有一点细微的差别.你可以使用try.kotlinlang.org在不需要一个真正的项目和不需要部署到机器的前提下来测试一些简单的代码范例. 1. 怎 ...