Hibernate中ID生成策略
四、ID生成策略 第一种:XML配置ID 通过为id元素增加generator子元素,该子元素拥有class属性。常用的class属性有: (1)increment:用于为long、short、或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据的时候才能使用。在集群不要使用。(极
四、ID生成策略
第一种:XML配置ID
通过为
(1)increment:用于为long、short、或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据的时候才能使用。在集群不要使用。(极少使用)
(2)native:让数据库自动选择identity,sequence,或者其他。
(3)uuid:128位的UUID算法,产生String类型ID
(4)identity:对于DB2、MySQL、SQL Server、Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long、short或者int类型。
sequence:在Oracel,PostgreSQL,SAP,DB,Mckio中使用序列(sequence),而在Interbase中使用生成器(generator),返回的标识符是long、short或者是int类型。
小实验1:
(1)创建Student.java
package com.zgy.hibernate.model; public class Student { private String id; private String name; private int age; private int score; public int getScore() { return score; } public void setScore(int score) { this.score = score; } public String getId() { return id; } public void setId(String 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; } }
(2)在Student.hbm.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="com.zgy.hibernate.model"> <class name="Student" table="student"> <id name="id" column="id"> <generator class="uuid"></generator> </id> <property name="name" column="name"></property> <property name="age" column="age"></property> <property name="score" column="score"></property> </class> </hibernate-mapping>
(3)测试
package com.zgy.hibernate.model; import static org.junit.Assert.*; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class HibernateIDTest { public static SessionFactory sf = null; @BeforeClass public static void beforeClass(){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); } @Test public void testStudent() { Student s = new Student(); s.setName("张三"); s.setAge(20); s.setScore(90); Session session = sf.openSession(); session.beginTransaction(); session.save(s); session.getTransaction().commit(); session.close(); } @AfterClass public static void afterClass(){ sf.close(); } }
(4)验证
select * from student; +-----------------------------------------------+--------+------+------+ | id | name | age | score | +------------------------------------------------+------+-------+------+ | 4028dae54aa322d1014aa322d5a50000 | 张三 | 20 | 90 | +----------------------------------+------+-----+-------+------+------+ desc student;
数据插入成功,id类型为varchar(255),主键
小实验2:
(1)修改Student.java。将id修改为int类型
package com.zgy.hibernate.model; public class Student { private int id; private String name; private int age; private int score; public int getScore() { return score; } public void setScore(int score) { this.score = score; } 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; } }
(2)在Student.hbm.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="com.zgy.hibernate.model"> <class name="Student" table="student"> <id name="id" column="id"> <generator class="native"></generator> </id> <property name="name" column="name"></property> <property name="age" column="age"></property> <property name="score" column="score"></property> </class> </hibernate-mapping>
(3)测试(删除student表)
(4)验证
select * from student; +----+------+-------+-------+ | id | name | age | score | +----+------+-------+-------+ | 1 | 张三 | 20 | 90 | +----+------+-----+--------+ desc student;
数据插入成功,id为int(11)类型,主键,Auto_increment
第二种:Annotation配置ID
@GeneratedValue,默认的策略是auto,auto相当于XML中配置的native。
小实验1:
(1)编写Teacher.java。在getId()方法上添加@GeneratedValue
package com.zgy.hibernate.model; import java.util.Date; import javax.annotation.Generated; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; @Entity @Table(name="_teacher") public class Teacher { private int id; private String name; private String title; private String address; private String wifeName; private Date birth; private ZhiCheng zhiCheng; @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name="_name") 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; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getWifeName() { return wifeName; } public void setWifeName(String wifeName) { this.wifeName = wifeName; } @Temporal(TemporalType.DATE) public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } @Enumerated(EnumType.STRING) public ZhiCheng getZhiCheng() { return zhiCheng; } public void setZhiCheng(ZhiCheng zhiCheng) { this.zhiCheng = zhiCheng; } }
(2)编写TeacherTesting.java,用于测试
package com.zgy.hibernate.model; import static org.junit.Assert.*; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; impo【本文来自鸿网互联 (http://www.68idc.cn)】rt org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class TeacherTesting { public static SessionFactory sf = null; @BeforeClass public static void beforeClass(){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); } @Test public void test() { Teacher t = new Teacher(); t.setName("t1"); t.setTitle("高级"); t.setAddress("北京"); t.setBirth(new Date()); t.setZhiCheng(ZhiCheng.A); Session session = sf.openSession(); session.beginTransaction(); session.save(t); session.getTransaction().commit(); session.close(); } @AfterClass public static void afterClass(){ sf.close(); } }
(3)验证
select * from _teacher; desc _teacher;
数据插入成功,id为int(11),主键,auto_increment
在使用Annotation的时候,除了使用auto策略,还可以使用increment,identity,sequence,table等等。
小实验2:
(1)修改Teacher.java.修改策略为identity
package com.zgy.hibernate.model; import java.util.Date; import javax.annotation.Generated; import javax.persistence.Column; 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.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; @Entity @Table(name="_teacher") public class Teacher { private int id; private String name; private String title; private String address; private String wifeName; private Date birth; private ZhiCheng zhiCheng; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name="_name") 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; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getWifeName() { return wifeName; } public void setWifeName(String wifeName) { this.wifeName = wifeName; } @Temporal(TemporalType.DATE) public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } @Enumerated(EnumType.STRING) public ZhiCheng getZhiCheng() { return zhiCheng; } public void setZhiCheng(ZhiCheng zhiCheng) { this.zhiCheng = zhiCheng; } }
(2)测试
(3)验证
select * from _teacher; desc _teacher;
使用table策略:
@javax.persistence.TableGenerator( name="Teacher_GEN", table="GENERATOR_TABLE", pkColumnName="pkkey", valueColumnName="pkvalue", pkColumnValue="Teacher", allocationSize=1 )
以上Annotation的意义:首先是定义了一个generator,该generator的名字叫做Teacher_GEN,生成一张表,表名为GENERATOR_TABLE,该表有两个字段,分别为pkColumnName和valueColumnName。这个表的第一条数据是:Teacher , 1。其下一条数据的步长值,即Teacher表的下一条数据的值会是2
小实验3:
(1)修改Teacher.java类
package com.zgy.hibernate.model; import java.util.Date; import javax.annotation.Generated; import javax.persistence.Column; 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.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; @Entity @javax.persistence.TableGenerator( name="Teacher_GEN", table="GENERATOR_TABLE", pkColumnName="pkkey", valueColumnName="pkvalue", pkColumnValue="Teacher", allocationSize=1 ) public class Teacher { private int id; private String name; private String title; private String address; private String wifeName; private Date birth; private ZhiCheng zhiCheng; @Id @GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN") public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name="_name") 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; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getWifeName() { return wifeName; } public void setWifeName(String wifeName) { this.wifeName = wifeName; } @Temporal(TemporalType.DATE) public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } @Enumerated(EnumType.STRING) public ZhiCheng getZhiCheng() { return zhiCheng; } public void setZhiCheng(ZhiCheng zhiCheng) { this.zhiCheng = zhiCheng; } }
(2)测试
(3)验证
查看hibernate执行过程中产生的sql语句
Hibernate: select pkvalue from GENERATOR_TABLE where pkkey = 'Teacher' for update
Hibernate: insert into GENERATOR_TABLE(pkkey, pkvalue) values('Teacher', ?)
Hibernate: update GENERATOR_TABLE set pkvalue = ? where pkvalue = ? and pkkey = 'Teacher'
Hibernate: select pkvalue from GENERATOR_TABLE where pkkey = 'Teacher' for update
Hibernate: update GENERATOR_TABLE set pkvalue = ? where pkvalue = ? and pkkey = 'Teacher'
Hibernate: insert into Teacher (address, birth, _name, title, wifeName, zhiCheng, id) values (?, ?, ?, ?, ?, ?, ?)
查看数据表
select * from generator_table; select * from teacher;

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

XML文件可以用PPT打开吗?XML,即可扩展标记语言(ExtensibleMarkupLanguage),是一种被广泛应用于数据交换和数据存储的通用标记语言。与HTML相比,XML更加灵活,能够定义自己的标签和数据结构,使得数据的存储和交换更加方便和统一。而PPT,即PowerPoint,是微软公司开发的一种用于创建演示文稿的软件。它提供了图文并茂的方

酷睿i73770配什么显卡好啊RTX3070是一款非常强大的显卡,它具有出色的性能和先进的技术。无论是玩游戏、渲染图形还是进行机器学习,RTX3070都能轻松应对。它采用了NVIDIA的Ampere架构,拥有5888个CUDA核心和8GB的GDDR6内存,能够提供流畅的游戏体验和高品质的图形效果。RTX3070还支持光线追踪技术,能够呈现逼真的光影效果。总之,RTX3070是一款强大而先进的显卡,适合那些追求高性能和高品质的用户使用。RTX3070是一款NVIDIA系列的显卡。采用第2代NVID

讯飞听见升级会议纪要功能,可以将口语表述直接转化为书面稿,AI能够根据录音总结会议纪要。AI能够帮助您完成会议纪要的撰写工作8月31日,讯飞听见网页端进行了版本升级,新增了PC端实时录音功能,能够利用人工智能智能生成会议纪要。这一功能的推出将大大提高用户在会议后整理内容、跟进重点工作事项的效率。对于经常参加会议的人来说,这个功能无疑是一个非常实用的工具,能够节省大量时间和精力该功能的应用场景主要是PC电脑端录音转文字自动生成会议纪要,旨在为用户提供最优质的服务和最先进的技术,快速提升办公效率的产

i73770配rx5600xt因为RX5600XT显卡与R53600CPU配套,所以我们选择了i7-3770。RX5600XT显卡的评测结果如下:RX5600XT显卡是一款性能出色的显卡,经过测试表现非常出色。它采用了AMD的RDNA架构,拥有6GBGDDR6显存和192-bit内存接口,支持PCIe4.0总线,具备卓越的游戏性能。在各项测试中,RX5600XT显卡都表现出色。在高分辨率下,它能够提供流畅的游戏体验,并且在大多数游戏中都能够保持60帧以上的帧率。在最新的游戏中,它也能够提供很好的

如何使用PHP生成可刷新的图片验证码随着互联网的发展,为了防止恶意攻击和机器自动操作现象,很多网站都使用了验证码来进行用户验证。其中一种常见的验证码类型就是图片验证码,通过生成一张包含随机字符的图片,要求用户输入正确的字符才能进行后续操作。本文将介绍如何使用PHP生成可刷新的图片验证码,并提供具体的代码示例。步骤一:创建验证码图片首先,我们需要创建一个用于生

PHP秒杀系统中的价格策略和促销活动设计要点在一个秒杀系统中,价格策略和促销活动设计是非常重要的一部分。合理的价格策略和精心设计的促销活动可以吸引用户参与秒杀活动,提升系统的用户体验和盈利能力。下面将详细介绍PHP秒杀系统中的价格策略和促销活动设计要点,并提供具体的代码示例。一、价格策略设计要点确定基准价格:在秒杀系统中,基准价格是指商品正常销售时的价格。在

C#开发中如何处理XML和JSON数据格式,需要具体代码示例在现代软件开发中,XML和JSON是广泛应用的两种数据格式。XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,而JSON(JavaScript对象表示)是一种轻量级的数据交换格式。在C#开发中,我们经常需要处理和操作XML和JSON数据,本文将重点介绍如何使用C#处理这两种数据格式,并附上

EXE转PHP:实现功能扩展的有效策略随着互联网的发展,越来越多的应用程序开始向web化迁移,以实现更大范围的用户访问和更便捷的操作。在这个过程中,将原本以EXE(执行文件)方式运行的功能转化为PHP脚本的需求也在逐渐增加。本文将探讨如何将EXE转换为PHP来实现功能扩展,同时给出具体的代码示例。为什么将EXE转换为PHP跨平台性:PHP是一种跨平台的语言
