保证唯一性(auto_increment)

  一、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.model">
<class name="Student" table="t_student" dynamic-update="true">
<id name="id" >
<generator class="native"></generator>
</id> <property name="name"></property>
</class>
</hibernate-mapping>

  <id> 标签必须配置在 <class>标签内第一个位置。由一个字段构成主键,如果是复杂主键<composite-id> 标签 

  <generator> 元素 (主键生成策略)

  如:<generator class="native"/>  根据是什么数据库,自动选择,mysql默认是 'identity' 即 auto_increment 

    <generator class="uuid "/>  用一个128-bit的UUID算法生成字符串类型的标识符 在Mysql类型是 varchar(255)

  二、annotation方式

  在相应的get方法上使用@GeneratedValues(strategy=GeneratedType)

  strategy 取值:如:strategy=GenerationType.AUTO

  1.AUTO(默认值) - 可以是identity column类型,或者sequence 类型 或者 table 类型取决于不同的底层数据库 相当于 native

    1、对于mysql,使用auto_increment

    2、对于oracle使用hibernate_sequence(名称固定)

  2.TABLE - 使用表保存id值

    就是在数据库中建立一个表,这个表包含两个字段,一个字段表示名称,另一个字段表示值。

    每次在添加数据时,使用第一个字段的名称,来取值作为添加数据的ID,然后再给这个值累加一个值再次存入数据库,以便下次取出使用。  

  @Entity
  @javax.persistence.TableGenerator(
    name="Teacher_GEN",        //生成策略的名称
    table="GENERATOR_TABLE",    //在数据库生成表的名称
    pkColumnName = "pk_key",      //表中第一个字段的字段名 类型为varchar,key
    valueColumnName = "pk_value",   //表中第二个字段的字段名 int ,value
    pkColumnValue="teacher",      //这个策略中使用该记录的第一个字段的值(key值)
    initialValue = 1,            //这个策略中使用该记录的第二个字段的值(value值)初始化值
    allocationSize=1         //每次使用数据后累加的数值
  )
  @GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN")

  3.IDENTITY - identity column 

    对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。

    返回的标识符是long, short 或者int类型的。 (数据库自增)

    注意:此生成策略不支持Oracle

   

  4.SEQUENCE - sequence
    在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),

    而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。(数据库自增)
    注意:此生成策略不支持MySQL

联合主键(多个字段构成唯一性)

 <hibernate-mapping package="com.bjsxt.hibernate.model">
<class name="Student" table="t_student">
<composite-id name="pk" class="com.bjsxt.hibernate.model.StudentPK">
<key-property name="id"></key-property>
<key-property name="name"></key-property>
</composite-id> <property name="age" />
<property name="sex" />
<property name="good" type="yes_no"></property>
</class>
</hibernate-mapping>

  1.xml方式

    a)建立复合主键类 (必须实现Serializable接口)

    b)在实体类中引用复合主键类

    c)student.hbm.xml 映射文件   

    <composite-id name="studentPK" class=>
      <key-property name="id"/>
      <key-property name="name"/>
    </composite-id>

  2.annotation方式

  三种方法:一般用  2  3

 @Entity
@Table(name="t_teacher")
/*@IdClass(TeacherPK.class)*/
public class Teacher {
private int id;
private String name;
/*private TeacherPK tfk;*/ private int age;
private String teach;
private Date birthday;
private Gender gender;
/*@EmbeddedId
public TeacherPK getTfk() {
return tfk;
}
public void setTfk(TeacherPK tfk) {
this.tfk = tfk;
}*/

  1.将组件类(TeacherPK)注解为 @Embeddable,并将组件的属性(getTPk())注解为@Id

  2.将组件的属性 (getTPk()) 注解为 @EmbeddedId

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

注:不管哪种方式 联合主键类(如:Teacherpk) 需要

  1.实现  Serializable  接口

  2.需要重写equals 和 hashCode方法

    (Teacher类 存到 DB中 需要保证Teacher对象中联合主键唯一,所以需要有equals和hashCode)

4.ID主键生成策略的更多相关文章

  1. Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略

    一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...

  2. Hibernate的ID主键生成策略

    ID生成策略(一) 通过XML配置实现ID自己主动生成(測试uuid和native) 之前我们讲了除了通过注解的方式来创建一个持久化bean外.也能够在须要持久化的bean的包路径下创建一个与bean ...

  3. hibernate(二)主键生成策略

    hibernate主键生成策略主要指的是在实体类orm的配置 <id name=""> <generator class="native"&g ...

  4. 【hibernate】主键生成策略使用UUID报出如下警告:org.hibernate.id.UUIDHexGenerator - HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 4122 compliant UUID values;

    主键生成策略使用UUID报出如警告如下: 控制台- 2017-11-24 18:40:14 [restartedMain] WARN org.hibernate.id.UUIDHexGenerator ...

  5. Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...

  6. hibernate主键生成策略

    在hibernate中,提供了多种主键生成器(不同的数据库,不同的表结构使用的主键生成策略也不相同),查阅相关资料经过实验总结如下: 1.increment 主键按照数值顺序递增,使用当前实例中最大值 ...

  7. Hibernate主键生成策略(转)

    1.自动增长identity 适用于MySQL.DB2.MS SQL  Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL ...

  8. hibernate 注解 主键生成策略

    一.JPA通用策略生成器       通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...

  9. 大家一起撸代码之——Hibernate各种主键生成策略与配置详解

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

随机推荐

  1. python之scrapy爬取jd和qq招聘信息

    1.settings.py文件 # -*- coding: utf-8 -*- # Scrapy settings for jd project # # For simplicity, this fi ...

  2. RabbitMQ学习之:(十)AMQP和RabbitMQ介绍 (转贴+我的评论)

    From: http://www.infoq.com/cn/articles/AMQP-RabbitMQ 准备开始 高级消息队列协议(AMQP1)是一个异步消息传递所使用的应用层协议规范.作为线路层协 ...

  3. 【笔记】Docker入门

    这个文章讲的比较透彻,就不复制粘贴了 <Docker从入门到实践>阅读笔记 Docker安装 环境 root@fudonghai:~# uname -a Linux fudonghai - ...

  4. Web比赛4

    广外2019-11-30 @广外-枯燥的抽奖 <?php #这不是抽奖程序的源代码!不许看! header("Content-Type: text/html;charset=utf-8 ...

  5. Web工作方式

    我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容.在这个看似简单的用户行为背后,到底隐藏了些什么呢? 对于普通的上网过程,系统其实是这样做的:浏览器本身是一个 ...

  6. Guava源码阅读-base-Strings

    package com.google.common.base; 今天阅读的是Srings类,这在程序中经常使用. 比如判断字符串是否为空,我们在之前用jdk方法判断是会用下面这个判断语句. if( i ...

  7. JS动态添加的标签无法绑定事件解决方案~~~

    今天用ajax实现动态插入数据时发现监听一直不起作用,一样的代码,非动态的就可以监听实现 这是困扰了我近一个小时的bug,后面才理解到可能是动态插入导致的! 看了看网上的解决方案,似乎都不太通俗,讲的 ...

  8. Stream系列(十一)SummarizingDouble方法使用

    汇总 视频讲解: https://www.bilibili.com/video/av78011675/ EmployeeTestCase.java package com.example.demo; ...

  9. 【ActiveReports 大数据分析报告】2019国庆旅游出行趋势预测

    今年国庆假期全国接待国内游客人数有望达到8亿人次! 随着2019国庆小长假的临近,不少游客已经开始着手规划假期出游路线.据权威机构发布的<2019国庆旅游趋势预测报告>显示,今年“十一黄金 ...

  10. row_number()、rank()、dense_rank()排序方式的区别

    1.row_number() 排序策略,连续排序,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,例如1,2,3,4   SELECT names,dept,row_number() OV ...