博客信息

hibernate之主键生成策略

发布时间:『 2019-02-26 05:36』  博客类别:SSH  阅读(780)

1、SessionFactoryUtils工具类

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>

  

2、程序员自己控制:assigned

准备工作

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

3、数据库控制: identity(标识列/自动增长) sequence

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

4、hibernate控制:increment uuid/uuid.hex

Increment

数字,无需赋值

org.hibernate.id.IdentifierGenerationException:

Unknown integral data type for ids : java.lang.String

表没用int类型报以上错误

 

uuid/uuid.hex

由容器自动生成的一个32位的字符串,.hex代表的是十六进制

5、其它native

等于identity+sequence

       该字段支持无缝移植。

6、自定义主键生成器

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......


 

关键字:     hibernate  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有