用途:
将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式
也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,不必担心不同数据库不兼容造成的问题。
@TableGenerator注解属性解释:
name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
table属性表示表生成策略所持久化的表名。
catalog属性和schema具体指定表所在的目录名或是数据库名。
pkColumnName属性的值表示在持久化表中,该主键生成策略所对应键值的名称。
valueColumnName属性的值表示在持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加。
pkColumnValue属性的值表示在持久化表中,该生成策略所对应的主键。
initialValue表示主键初识值,默认为0。
allocationSize表示每次主键值增加的大小,默认为50。
实现步骤:
一、创建自动生成主键表
CREATE TABLE `user_generation` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pk_user_id_name` varchar(50) DEFAULT NULL, `pk_user_id_value` int(50) DEFAULT NULL, PRIMARY KEY (`id`) )
二、所需jar包
ant-1.7.1.jar antlr-2.7.6.jar commons-collections-3.2.1.jar dom4j-1.6.1.jar hibernate-annotations-3.4.0.GA.jar hibernate-commons-annotations-3.3.0.ga.jar hibernate-core-3.3.2.GA.jar hibernate-ehcache-3.3.2.GA.jar hibernate-jpa-2.0-api-1.0.0.Final.jar hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar junit-4.5.jar junit.jar mysql-connector-java-5.0.8-bin.jar slf4j-api-1.6.1.jar slf4j-nop-1.6.1.jar
三、创建实体类
package com.fk.entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.TableGenerator; /** * @Description 用户实体 * @author mqyl1 */ @Entity //表明该类是一个实体,与数据库对应 @Table(name="T_USER") //对应数据库中的表名 public class User implements Serializable { //用户ID private int sid; //用户名 private String userName; //用户密码 private String password; @Id //对应数据库中的主键 @GeneratedValue(strategy=GenerationType.TABLE,//指定主键生成策略 generator="PK_user") //对应生成策略名称 @TableGenerator(name="PK_user", //生成策略名称 pkColumnName="pk_user_id_name", //主键的列名 pkColumnValue="USER_PK", //主键的值 valueColumnName="pk_user_id_value", //生成的值 列名 table="USER_GENERATION", //生成的表名 //initialValue=0 [主键初识值,默认为0。] //catalog schema 指定表所在的目录名或是数据库名。 allocationSize=1) //主键每次增加的大小,默认为50 @Column(name="pk_sid") //对应pk_sid字段 public int getSid() { return sid; } @Column(name="f_userName") //映射字段 public String getUserName() { return userName; } @Column(name="f_password") //映射字段 public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public void setSid(int sid) { this.sid = sid; } public void setUserName(String userName) { this.userName = userName; } public User() { super(); } public User(String userName, String password) { super(); this.userName = userName; this.password = password; } }
四、书写配置文件
<?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> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://192.168.62.51:3306/test</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <!-- <mapping package="com.fk.entity"/> --> <mapping class="com.fk.entity.User"/> </session-factory> </hibernate-configuration>
五、书写测试类,我采用junit-4.5.jar,使用注解方式测试
package com.fk.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.AnnotationConfiguration; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.fk.entity.User; public class UserTest { private Session session; //初始化session @Before public void initSession() { // 我们平常使用这种方式 会报 // org.hibernate.MappingException: An AnnotationConfiguration instance is required to use // <mapping package="com.fk.entity"/> // SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); //要使用下面这种方式 SessionFactory factory = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory(); session = factory.openSession(); } @Test public void testAddUser() { User user = new User("张三","1234"); Transaction tran = session.beginTransaction(); //开启事务 session.save(user); //保存用户 tran.commit(); //提交数据 } @Test public void testFindAll() { session.beginTransaction(); User user = (User) session.get(User.class, 1); Assert.assertEquals("张三", user.getUserName()); } }
六、添加两次数据库的内容如下
1、用户表
2、主键生成表
每次添加用户时,会先到主键生成表中查询出主键的值。