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() 到数据库前,编码人员手工设置主键值,也就是调 ...
随机推荐
- CSS绘制三角形和箭头,不用再用图片了
前言 还在用图片制作箭头,三角形,那就太lou了.css可以轻松搞定这一切,而且颜色大小想怎么变就怎么变,还不用担心失真等问题. 先来看看这段代码: /**css*/.d1{ width: 0; he ...
- RMAN 'Duplicate From Active Database' Feature in Oracle11g (Doc ID 452868.1)
RMAN 'Duplicate From Active Database' Feature in Oracle11g (Doc ID 452868.1) APPLIES TO: Oracle Data ...
- Undo 相关的等待事件和已知问题 (Doc ID 1575701.1)
Undo Related Wait Events & Known Issues (Doc ID 1575701.1) APPLIES TO: Oracle Database - Enterpr ...
- numpy和matplotlib的pyplot函数的简单应用实现
- MySQL的基础架构
TCP/IP看不下去了,我觉得还是从应用层入手,接下来2个月我将主要学习数据库相关和算法知识,网络我一直不熟,所以看起专业书籍很吃力,可以说是浪费时间,这次数据库学习目标是先将方向纠正一下,然后其中的 ...
- 0day2安全——笔记4(修改临界变量)
第二章 修改临界变量 #include <stdio.h> #include <string.h> #define PASSWORD "1234567" i ...
- python爬虫之csv文件
一.二维数据写入csv文件 题目要求: 读入price2016.csv文件,将其中的数据读出,将数字部分计算百分比后输出到price2016out.csv文件中 知识点: 对于列表中存储的二维数据, ...
- Python程序中的线程操作-锁
目录 一.同步锁 1.1 多个线程抢占资源的情况 1.1.1 对公共数据的操作 1.2 同步锁的引用 1.3 互斥锁与join的区别 二.死锁与递归锁 2.1 死锁 2.2 递归锁RLock 三.典型 ...
- IT兄弟连 Java语法教程 赋值运算符
从本书之前的内容中就一直在使用赋值运算符.现在是正式介绍赋值运算符的时候了.赋值运算符是单个等号”=“.在Java中,赋值运算符的工作方式与所有其它计算机语言相同.它的一般形式如下: var = ex ...
- pytest框架之rerunfailures失败重运行机制
web自动化测试中,稳定性在整个测试运行中都至关重要,但不能保证测试脚本或者测试环境一直都能够稳定,它牵扯到诸多因素,在这里就不赘述,pytest框架相较于unittest的一大优势就在于拥有用例失败 ...