hibernate之主键生成策略
首先建立Student和Woker的实体类,在导入两个实体类的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.two.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="increment" /> hibernate控制--> <generator class="increment" /> <!-- <generator class="sequence" />String类型的ID --> <!-- <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>
主键策略分为四种,人工控制,数据库控制,以及hibernate控制,
generator中填的其实是一个类
人工控制:
数据库变化:
然后在是数据库控制数据
数据库控制 数据库没有列段没有自增会报错,仅限数字类型
数据库:
跟手动输入的值没有任何的关系,只会跟随数据库的自增而变化
自定义主键策略:
package com.two; 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 MyTsGenerator implements IdentifierGenerator { @Override public Serializable generate(SharedSessionContractImplementor arg0, Object arg1) throws HibernateException { // TODO Auto-generated method stub SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return "book_order_"+sdf.format(new Date()); } }
可以自定义将ID列段改成自定义内容
需要将你自己写的自定义的类的路劲写入class
数据库变化:
自定义uuid:
随机生成32位的String数值
数据库变化
这就是hibernate的主键策略