hibernate中的主键生成策略

一、在hibernate的实体映射配置文件中配置hibernate的主键生成器:

generator元素:表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 。

<?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.hibernate.entity.User" table="t_hibernate_user">
        <!-- name:指的是类属性   type: 类属性的类型      column: 对应表的对应列  -->
	<!-- id标签对应的为表示列 -->
	<id name="id" type="java.lang.Integer" column="id">
	    <!-- 配置数据库的主键生成策略 -->
	    <generator class="increment"></generator>		
        </id>

        <!-- name:指的是类属性   type: 类属性的类型      column: 对应表的对应列  -->
        <property name="" type="" column=""></property> 
        <!-- property 标签的个数与实体类中的属性相对应 -->
           ......
    </class>
</hibernate-mapping>

generator元素中的class属性可决定生成主键的类型:

1、hibernate控制:

incrementuuid/uuid.hex

public static void main(String[] args) {
		Configuration configure = new Configuration().configure("hibernate.cfg.xml");
		SessionFactory sessionFactory = configure.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

                /*
                 *  increment: 将主键生成策略设置为increment,即使数据库中的主键没有设置自增长,
                 *         hibernate也会为你维护主键,不过数据库中维护的主键的类型必须为数字类型
                 *  
                 *  uuid/uuid.hex: 也是hibernate帮你维护主键,主键类型必须为字符串类型
                 *
                 *
                 */


                User user=new User();
		user.setUser_name("张三");
                session.save(user);

		transaction.commit();
		session.close();
	}

 

2、数据库控制:

identity(标识列/自动增长)  、 sequence

public static void main(String[] args) {
		Configuration configure = new Configuration().configure("hibernate.cfg.xml");
		SessionFactory sessionFactory = configure.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

                /*
                 *  下面两种都是数据库自动维护的类型:
                 *  identity: 主键字段的类型为数字类型,且设置了自增长,否则会报错
                 *  
                 *  sequence: 当使用oracle数据库时,对于主键字段设置的序列进行维护
                 *
                 *
                 */

                User user=new User();
		user.setUser_name("张三");
                session.save(user);

		transaction.commit();
		session.close();
	}

3、添加数据时手动设置:

assigned

public static void main(String[] args) {
		Configuration configure = new Configuration().configure("hibernate.cfg.xml");
		SessionFactory sessionFactory = configure.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

                /*
                 *  数据类型不限、保存前设置的值,必须赋值
                 */
                User user=new User();
	        user.setId(999);
		user.setUser_name("张三");
                session.save(user);

		transaction.commit();
		session.close();
	}

4、自定义主键生成策略:

下面新建了一个class:MyIncrement.java,实现 IdentifierGenerator接口,接口内有一个generate需要重写,

这个方法返回的值即为我们想要主键自动生成的值。

package com.hibernate.util;

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 MyIncrement implements IdentifierGenerator{

	@Override
	public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
		return "my_test_"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
	}
}

在实体映射的xml文件中将MyIncrement.java的全类名填入即可:

<generator class="com.hibernate.util.MyIncrement"></generator>		
       

猜你喜欢

转载自blog.csdn.net/qq_41097820/article/details/84314978