package com.javaxl.two.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class SessionFactoryUtils {
private static SessionFactory sessionFactory;
static {
Configuration cfg = new Configuration().configure("/hibernate.cfg.xml");
sessionFactory = cfg.buildSessionFactory();
}
public static Session openSession() {
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());
}
}Hibernate.cfg.xml中配置
<!-- 配置本地事务(No CurrentSessionContext configured!) --> <property name="hibernate.current_session_context_class">thread</property>
准备工作
IdDemo.java
package com.javaxl.two.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.javaxl.two.entity.Student;
import com.javaxl.two.entity.Worker;
import com.javaxl.two.util.SessionFactoryUtils;
public class IdDemo {
public String add(Worker worker) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
String wid = (String) session.save(worker);
transaction.commit();
SessionFactoryUtils.closeSession();
return wid;
}
public Integer add(Student student) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
Integer sid = (Integer) session.save(student);
transaction.commit();
SessionFactoryUtils.closeSession();
return sid;
}
public static void main(String[] args) {
// studentDemo();
workerDemo();
}
public static void studentDemo() {
IdDemo demo = new IdDemo();
Student student = new Student();
student.setSname("x");
// student.setSid(57);
// ds for this class must be manually assigned before calling save(): com.javaxl.two.entity.Student 当配置assigned的时候
demo.add(student);
}
public static void workerDemo() {
IdDemo demo = new IdDemo();
Worker worker = new Worker();
worker.setWname("x");
System.out.println(demo.add(worker));
// 402811816be126af016be126b3880000 hex 32
// 402811816be12798016be1279c650000 uuid.hex
// zking_user_2019-07-11 21:14:19 自定义主键生成策略
}
}
*.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.javaxl.two.entity.Worker" table="t_hibernate_worker">
<id name="wid" type="java.lang.String" column="wid">
<!-- <generator class="assigned" /> -->
<!-- <generator class="uuid" /> -->
<!-- <generator class="uuid.hex" /> -->
<!-- <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><?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.javaxl.two.entity.Student" table="t_hibernate_student">
<id name="sid" type="java.lang.Integer" column="sid">
<!-- <generator class="assigned" /> -->
<!-- <generator class="increment" /> -->
<!-- <generator class="identity" /> -->
<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>
结论:
数据类型不限、保存前必须赋值
当映射文件中配置<generator class="assigned" />,那么主键生成交给程序员代码进行控制
worker.setWid("w1");
如果开发人员没有添加上面代码,那么将会报一下错误
org.hibernate.id.IdentifierGenerationException:
ids for this class must be manually assigned before calling save(): com.javaxl.two.entity.Worker
Identity
数字,无需赋值
org.hibernate.exception.GenericJDBCException: could not execute statement
Caused by: java.sql.SQLException: Field 'sid' doesn't have a default value
选用这个需要数据库主键配置自增长。否则,报以上错误。用于mysql。
Sequence
数字,无需赋值, 默认使hibernate_sequence这个序列,
也可以通过sequence/sequence_name参数赋值
配置hibernate.cfg.xml
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
可以看到控制台如下
Hibernate:
select
hibernate_sequence.nextval
from
dual
说明Oracle默认用hibernate_sequence给表的主键赋值。
在映射文件*.hbm.xml红配置
<generator class="sequence" >
<param name="sequence_name">aaa</param>
</generator>
控制台打印如下:
Hibernate:
select
aaa.nextval
from
dual
Increment
数字,无需赋值
org.hibernate.id.IdentifierGenerationException:
Unknown integral data type for ids : java.lang.String
表没用int类型报以上错误
uuid/uuid.hex
由容器自动生成的一个32位的字符串,.hex代表的是十六进制
等于identity+sequence
该字段支持无缝移植。
package com.javaxl.two.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 Myts implements IdentifierGenerator{
@Override
public Serializable generate(SharedSessionContractImplementor arg0, Object arg1) throws HibernateException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return "zking_user_"+sdf.format(new Date());
}
}
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有