一、在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控制:
increment、uuid/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>