generator元素:表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 。 先建立实体类和对应的xml文件: hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 1. 数据库相关 --> <property name="connection.username">root</property> <property name="connection.password">123</property> <property name="connection.url">jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=UTF-8 </property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 配置本地事务(No CurrentSessionContext configured!) --> <property name="hibernate.current_session_context_class">thread</property> <!-- 2. 调试相关 --> <property name="show_sql">true</property> <property name="format_sql">true</property> <!-- 3. 添加实体映射文件 --> <mapping resource="com/zyc/one/entity/User.hbm.xml" /> <!-- 主键生成策略 --> <mapping resource="com/zyc/two/entity/Student.hbm.xml" /> <mapping resource="com/zyc/two/entity/Worker.hbm.xml" /> </session-factory> </hibernate-configuration>Student:
package com.zyc.two.entity; public class Student { private Integer sid; private String sname; public Student() { super(); } public Student(Integer sid, String sname) { super(); this.sid = sid; this.sname = sname; } public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } @Override public String toString() { return "Student [sid=" + sid + ", sname=" + sname + "]"; } }Student.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.zyc.two.entity.Student" table="t_hibernate_student"> <id name="sid" type="java.lang.Integer" column="sid"> <generator class="assigned" /> <!-- <generator class="increment" /> --> <!-- <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>Worker: Student的sid是Integer类型(与数据库表对应),而Worker中的wid是String类型(与数据库表对应)
package com.zyc.two.entity; public class Worker { private String wid; private String wname; public Worker() { super(); } public Worker(String wid, String wname) { super(); this.wid = wid; this.wname = wname; } public String getWid() { return wid; } public void setWid(String wid) { this.wid = wid; } public String getWname() { return wname; } public void setWname(String wname) { this.wname = wname; } @Override public String toString() { return "Worker [wid=" + wid + ", wname=" + wname + "]"; } }Worker.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.zyc.two.entity.Worker" table="t_hibernate_worker"> <id name="wid" type="java.lang.String" column="wid"> <generator class="assigned" /> <!-- <generator class="sequence" /> --> <!-- <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>今天学习hibernate主键生成策略,它一共有4种情况: 1、人工控制:assigned 第一种无论怎么样都要自己给属性(包括数据库列段有自增长),否则就会报错; 在以上代码中没有给id,而id在数据库中是自增长,但是不能增加 错误信息: 如果给了id就可以增加了,增加的值与你给的值同步;
2、数据库控制: identity(标识列/自动增长) sequence 在这一种情况中,如果数据库有列段是自增长,那么你在代码中在此列段给任何值都是由数据库控制的 例如: 原来数据库数据: 执行以下代码: 数据库增加后的信息: 我们增加的id是88,但数据库的id是自增长的,所以我们给的id作废;
引用identity的类id必须为数字类型(且必须为自增长),而引用sequence类的id为字符串类型; 3、hibernate控制:increment uuid/uuid.hex 在这种情况中不需要表中id字段为自增长,由hibernate自动自增长: 执行后数据库的信息: 我们又增加的是一个id为88的学生,但是它还是不会让自己控制,一样的自增长(不需要表中的id 属性为自增长) increment约束与上面一样都是要数字,uuid/uuid.hex也是要字符串id才能引用,自增长的值是由容器自动生成的一个32位的字符串。
4、自定义主键生成策略 实现org.hibernate.id.IdentifierGenerator接口即可,并还可以实现org.hibernate.id.Configurable接口来读取一些配置信息 MyTsGenerator:
package com.zyc.two.id; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.id.IdentifierGenerator; public class MyTsGenerator implements IdentifierGenerator { @Override public Serializable generate(SessionImplementor arg0, Object arg1) throws HibernateException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); return "zyc_book_"+sdf.format(new Date()); } }配置 执行代码: 结果: