使用情景
.将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得
.这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题
.准备前提:
-创建一个jpa项目
-配置persistence.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="jpa_1_helloworld" transaction-type="RESOURCE_LOCAL">
<!-- 改配置文件名字和位置必须是固定的 -->
<!-- 配置使用什么orm产品来作为jpa的实现 -->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- 添加持久化类 -->
<class>com.wayne.helloworld.Customer</class>
<properties>
<!-- 连接数据库基本信息 -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<!-- 配置JPA实现产品的基本属性,配置hibernate的基本属性 -->
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
-添加jar包:
1.首先创建如下表:
2.实体类代码如下:
package com.wayne.helloworld;
import java.util.Date;
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;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
/*
* 如果不添加@Table注解,则表名与实体类名相同
*/
@Table(name="JPA_CUSTOMERS")
@Entity
public class Customer {
private Integer id;
private String lastName;
private String email;
private int age;
private Date createdDate;
private Date birthDay;
@Column(name="ID")
@TableGenerator(name="ID_GENERATOR",
table="JPA_ID_GENERATOR",
//横向找到PK_NAME这一列
pkColumnName="PK_NAME",
pkColumnValue="CUSTOMER_ID",
//纵向找到PK_VALUE这一列
valueColumnName="PK_VALUE",
//增长值
allocationSize=100)
@GeneratedValue(strategy=GenerationType.TABLE,generator="ID_GENERATOR")
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="LAST_NAME",length=50,nullable=true)
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
//若属性名与字段名相同,则不需要填写注解
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//精度时间戳
@Temporal(TemporalType.TIMESTAMP)
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
@Temporal(TemporalType.DATE)
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
//工具方法,不需要映射为某个数据库表的一列
@Transient
public String getInfo(){
return "lastName:"+this.getLastName();
}
}
3.测试类代码如下:
package com.wayne.helloworld;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.创建EntitymanagerFactory
//是persistence.xml的persistence-unit标签name属性
String persistenceUnitName="jpa_1_helloworld";
EntityManagerFactory entityManagerFactory=Persistence.createEntityManagerFactory(persistenceUnitName);
//2.创建EntityManager
EntityManager entityManager=entityManagerFactory.createEntityManager();
//3.开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//4.进行持久化操作
Customer customer=new Customer();
customer.setAge(22);
customer.setEmail("www.wayne.com");
customer.setLastName("wayne");
customer.setCreatedDate(new Date());
customer.setBirthDay(new Date());
entityManager.persist(customer);
//5.提交事务
transaction.commit();
//6.关闭EntityManager
entityManager.close();
//7.关闭EntitymanagerFactory
entityManagerFactory.close();
}
}
4.运行后数据库结果: