hibernate之主键生成策略
1. hibernate的主键生成器:
generator元素:表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 。
连接数据库的xml
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- . 数据库相关 -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.url">jdbc:mysql://localhost:3306/sys?useUnicode=true&characterEncoding=UTF-8
</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 配置本地事务(No CurrentSessionContext configured!) -->
<property name="hibernate.current_session_context_class">thread</property> <!-- . 调试相关 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property> <!-- . 添加实体映射文件 -->
<mapping resource="com/jt/entity/User.hbm.xml"/>
<!--主键生成策略 -->
<mapping resource="com/jt2/entity/Student.hbm.xml"/>
<mapping resource="com/jt2/entity/Worker.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Student.java
package com.jt2.entity;
public class Student {
private Integer sid;
private String sname;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Student(Integer sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + "]";
}
}
Worker.java
package com.jt2.entity;
public class Worker {
private String wid;
private String wname;
public String getWid() {
return wid;
}
public void setWid(String wid) {
this.wid = wid;
}
public String getWname() {
return wname;
}
public void setWname(String wname) {
this.wname = wname;
}
public Worker(String wid, String wname) {
super();
this.wid = wid;
this.wname = wname;
}
public Worker() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Worker [wid=" + wid + ", wname=" + wname + "]";
}
}
实体类映射文件
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.jt2.entity.Student" table="t_hibernate_student">
<id name="sid" type="java.lang.Integer" column="sid">
<!-- <generator class="assigned" /> -->
<!-- <generator class="identity" /> -->
<generator class="increment" />
<!-- <generator class="increment" /> -->
<!-- <generator class="sequence" /> -->
<!-- <generator class="sequence" > <param name="sequence_name">aaa</param>
</generator> -->
<!-- <generator class="com.javaxl.two.id.Myts" /> -->
</id>
<property name="sname" type="java.lang.String" column="sname">
</property>
</class>
</hibernate-mapping>
Worker.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.jt2.entity.Worker" table="t_hibernate_worker">
<id name="wid" type="java.lang.String" column="wid">
<!-- <generator class="assigned" /> -->
<!-- <generator class="sequence" /> -->
<!-- <generator class="uuid" /> -->
<generator class="com.jt2.id.MyTsGenerator" />
<!-- <generator class="sequence" /> -->
<!-- <generator class="sequence" > <param name="sequence_name">aaa</param>
</generator> -->
<!-- <generator class="com.javaxl.two.id.Myts" /> -->
</id> <property name="wname" type="java.lang.String" column="wname">
</property>
</class>
</hibernate-mapping>
还有个工具类
SessionFactoryUtils.java
package com.jt2.util; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* 仅在学习hibernate的工程中使用,当进入spring的学习后就没用了,
* 后面会有ssh来代替它
*
* 作用:
* 用来检测hibernate中的配置文件的准确性
* hibernate.cfg.xml
* *.hbn.xml
* @author jt
*
*/
public class SessionFactoryUtils {
private static SessionFactory sessionFactory;
static {
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
sessionFactory = cfg.buildSessionFactory();
} public static Session openSession() {
//从本地的线程中获取session会话,第一次肯定是获取不到的,那么需要重新让sessionfactory创建一个session出来
//第二次就能够对第一次创建的session反复利用,节约性能
Session session = sessionFactory.getCurrentSession();
if(session == null) {
session = sessionFactory.openSession();
}
return session;
} public static void closeSession() {
Session session = sessionFactory.getCurrentSession();
if(session != null && session.isOpen()) {
session.close();
}
} public static void main(String[] args) {
Session session = SessionFactoryUtils.openSession();
session.beginTransaction();
System.out.println(session.isConnected());
SessionFactoryUtils.closeSession();
System.out.println(session.isConnected());
}
}
做测试用dao层做我们建一个
DemoDao.java
package com.jt2.dao; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction; import com.jt2.entity.Student;
import com.jt2.entity.Worker;
import com.jt2.util.SessionFactoryUtils;
/**
* hibernate中的主键生成策略
* 1,人工控制
* 2,数据库控制
* 3,hibrenate控制
* 4,自定义主键生成策略
* @author jt
*
*/
public class DemoDao { /**
* 新增学生
* @param stu
*/
public void addStudent(Student stu) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
session.save(stu);
transaction.commit();
SessionFactoryUtils.closeSession();
}
/**
* 新增功能
* @param worker
*/
public void addWorker(Worker worker) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
session.save(worker);
transaction.commit();
SessionFactoryUtils.closeSession();
}
public static void testStudent(String[] args) {
DemoDao dao=new DemoDao();
Student stu=new Student();
stu.setSname("哈哈哈");
stu.setSid();
dao.addStudent(stu);
} public static void main(String[] args) {
DemoDao dao=new DemoDao();
Worker worker=new Worker();
worker.setWname("jt");
dao.addWorker(worker);
} }


最后建一个
MyTsGenerator.java
package com.jt2.id; import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date; import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator; public class MyTsGenerator implements IdentifierGenerator { @Override
public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
return "book_order_"+sdf.format(new Date());
} }
然后我们把DemoDao.java里面的的测试数据改下


这就是成功了,今天就到这里了
hibernate之主键生成策略的更多相关文章
- hibernate 注解 主键生成策略
一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...
- 大家一起撸代码之——Hibernate各种主键生成策略与配置详解
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- Hibernate中主键生成策略
主键生成策略 increment identity sequence native uuid assigned 1) increment 由hibernate完成 主键递增, 原理:select ma ...
- Hibernate各种主键生成策略与配置详解
出自:http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前 ...
- Hibernate各种主键生成策略与配置详解《转》
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- hibernate的主键生成策略
一共是13种,其中包括native native: 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就 ...
- Hibernate各种主键生成策略与配置详解【附1--<generator class="foreign">】
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- 【转】Hibernate各种主键生成策略与配置详解
原文转自:Fra~~kaka's Blog 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无 ...
- hibernate 各种主键生成策略(转)
http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...
- Hibernate 之主键生成策略小总结
主键生成策略大致分两种: 手工控制策略 自动生成策略[框架自动生成和数据库自动生成] 手工控制策略: assigned:类型是任意的,需要在 save() 到数据库前,编码人员手工设置主键值,也就是调 ...
随机推荐
- [转]Java虚拟机类加载机制
原文地址:http://blog.csdn.net/u013256816/article/details/50829596 看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎 ...
- RHEL 6.6配置网易CentOS镜像的yum源小结
之前没有使用过网易CentOS镜像的yum源,最近由于需要,遂在一台测试服务器验证.测试了一下如何配置使用网易的Cent0S的yum源.此文仅仅是笔记性质,参考了网上大量资料(文末"参 ...
- android binder 进程间通信机制4-Service Manager
Service Manager 是Binder进程间通信的核心组件之一: 它扮演者Binder进程间通信上下文(Context Manager)的角色 负责管理系统中的Service组件 向Clien ...
- acwing 848 有向图的拓扑序列
地址 https://www.acwing.com/problem/content/description/850/ 题目描述给定一个n个点m条边的有向图,图中可能存在重边和自环. 请输出任意一个该有 ...
- Python gc
Python gc Python gc 模块提供垃圾回收器的接口 关于 Python 垃圾回收 <- 点击查看 官方文档:https://docs.python.org/3/library/gc ...
- Codeforces Round #599 (Div. 1) B. 0-1 MST 图论
D. 0-1 MST Ujan has a lot of useless stuff in his drawers, a considerable part of which are his math ...
- 第四组项目总结(UML图设计)
第四组项目总结(UML图设计) 相关链接: 墨刀原型链接:https://pan.baidu.com/s/1qrVI_je8NONVHT_FwH6Pwg 需求文档链接:https://www.cnbl ...
- Anaconda安装第三方库与pip和conda 添加国内源
Anaconda安装第三方库 PIP使用命令 Anaconda命令 pip和conda 添加国内源 1:PIP相关命令 卸载 pip uninstall XXX 1.升级pip python -m p ...
- Rust对协程的思考
最近和同事聊起来,觉得lua缺乏编译型语言的类型校验功能,还有变量拼写检查之类的,导致线上总是有低级错误出现.比如最近有一个是变量名拼写少了一个字母,导致某功能没开启:还有一个是变量传参时,之前测试多 ...
- WPF的DataGrid的某个列绑定数据的三种方法(Binding、Converter、DataTrigger)
最近在使用WPF的时候,遇到某个列的值需要根据内容不同进行转换显示的需求.尝试了一下,大概有三种方式可以实现: 1.传统的Binding方法,后台构造好数据,绑定就行. 2.转换器方法(Convert ...