表生成器 @TableGenerator

用途:

        将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式
        也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,不必担心不同数据库不兼容造成的问题。

@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、主键生成表

主键生成表

           每次添加用户时,会先到主键生成表中查询出主键的值。

猜你喜欢

转载自mqyl1.iteye.com/blog/1098358