您的位置:首页 > 理论基础 > 计算机网络

解决“你没有权限访问,请与网络管理员联系”

2016-04-09 17:44 423 查看
用途:

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

 

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

 



 

 

           每次添加用户时,会先到主键生成表中查询出主键的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: