hibernate中的主键生成策略

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

<?xml version="1.0" encoding="UTF-8"?>
    <!-- name:指的是类属性   type: 类属性的类型      column: 对应表的对应列  -->
    <property name="" type="" column=""></property> 
    <!-- property 标签的个数与实体类中的属性相对应 -->
       ......
</class>
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的全类名填入即可:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值