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晓码阁 版权所有