用途:
将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式
也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,不必担心不同数据库不兼容造成的问题。
@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、主键生成表
每次添加用户时,会先到主键生成表中查询出主键的值。
- 大小: 5.3 KB
- 大小: 4.6 KB
分享到:
相关推荐
- **pkColumnValue**:指定主键生成器表中主键列的初始值,同样,如果默认值不满足需求,可以进行设置。 #### 四、示例代码解析 ```java @Entity @Table(name="EMP") public class Employee implements ...
`@TableGenerator`注解用于配置主键生成器,特别是当主键生成策略为`GenerationType.TABLE`时。它允许我们自定义生成器的表名、分配大小、初始值等属性,以适应应用程序需求和数据库性能。 - `name`: 生成器的名称...
`@GeneratedValue`注解表明该字段的值应由数据库自动生成,而`@TableGenerator`则提供了关于生成器表的详细信息,如表名、初始值、步长等。下面是一个简单的示例: ```java import javax.persistence.Entity; ...
在此示例中,`employee_gen` 为主键生成器的名称,`ID_GEN` 为表名,`GEN_NAME` 和 `GEN_VAL` 分别为主键生成器表中的主键列和值列的名称。`initialValue` 设置为主键序列的初始值100,`allocationSize` 设置为50,...
该策略通过`@TableGenerator`注解来配置生成器的细节。 - **示例代码**: ```java @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "myTablePK") @TableGenerator( name = "myTablePK", ...
- `@TableGenerator`:用于配置表生成器。 #### 直接映射(Direct Mapping) - `@Basic`:用于映射基本类型的字段。 - `@Enumerated`:用于枚举类型的字段。 - `@Temporal`:用于日期和时间类型的字段。 - `@Lob`...
3. @SequenceGenerator:定义序列生成器,适用于Oracle等支持序列的数据库。 4. @JoinColumn:在关联关系中,定义外键所在的列。 5. @TableGenerator:非JPA标准,但提供了更灵活的主键生成策略。 四、实体生命周期...
例如,Hibernate允许通过@Entity注解标识一个类为Entity Class,@Table注解来指定对应的数据库表名,而@TableGenerator或@Id注解用于定义主键生成策略。 4. **属性和字段映射**: Entity Class的每个属性通常对应...
`@TableGenerator`和`@GeneratedValue(strategy = GenerationType.TABLE)`组合使用,当需要自定义主键生成策略时,如基于表的生成器。 最后,`@Override`注解用于确保重写的方法是来自父类的,这在实现持久化接口时...
9. **@TableGenerator**: 用于定义自定义的主键生成器,通常配合@GeneratedValue一起使用,适用于非自动递增的主键策略,例如序列。 这些注解的使用使得开发者能够在Java代码中声明式地完成ORM配置,极大地简化了...
- **@TableGenerator**: 用于定义基于表的主键生成器。 **4. 直接映射 (Direct Mapping)** - **@Basic**: 用于指定基本类型的映射,如 String、Integer 等。 - **@Enumerated**: 用于指定枚举类型的映射。 - **@...
- `@SequenceGenerator` 和 `@TableGenerator`:定义主键生成器的配置。 4. **直接映射批注**: - `@Basic`:默认的映射方式,适用于大多数Java基本类型和枚举类型。 - `@Enumerated`:用于将枚举类型映射到...
11. **元数据注解**:@TableGenerator和@SequenceGenerator用于定义生成主键的元数据源。 通过深入学习这些注解及其用法,开发者能够熟练地在Hibernate中实现ORM,提高开发效率,减少与数据库交互的复杂度。同时,...
5. **主键和索引** - 使用`@TableGenerator`和`@Id`定义主键生成器,`@Table`和`@UniqueConstraint`定义表的主键和唯一性约束。如果需要复合主键,可以使用`@EmbeddedId`和`@Embeddable`。 6. **数据类型选择** - ...
- `@SequenceGenerator`、`@TableGenerator`:指定主键生成器的细节。 4. **直接映射**: - `@Basic`:默认情况下,JPA自动处理基本类型的映射,但可以使用此批注进行微调。 - `@Enumerated`:将枚举类型映射为...
- **@SequenceGenerator** / **@TableGenerator**:用于定义序列或表生成器,以生成主键值。 4. **直接映射** - **@Basic**:指定一个基本属性,如字符串或整数等。 - **@Enumerated**:用于枚举类型的映射。 -...
使用JPA(Java Persistence API)的注解,如`@TableGenerator`、`@GeneratedValue(strategy=GenerationType.TABLE)`, 可以控制自增ID的生成策略。 6. **集成测试**:JUnit和Mockito等工具可以帮助编写单元测试,`@...