第二百三十四节 JPA教程 - JPA ID表生成器示例
JPA教程 - JPA ID表生成器示例
我们可以使用一个表作为id生成表。
以下代码使用@TableGenerator创建表并设置id值的初始值。
然后它使用表来在@GeneratedValue注释中生成值。
@TableGenerator(name = "Address_Gen", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", pkColumnValue = "Addr_Gen", initialValue = 10000, allocationSize = 100) @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "Address_Gen") private long id;
例子
下面的代码来自PersonDaoImpl.java。
package cn.w3cschool.common;import javax.persistence.EntityManager; import javax.persistence.PersistenceContext;import org.springframework.transaction.annotation.Transactional;@Transactional public class PersonDaoImpl {public void test(){Person p1 = new Person("Tom");p1.setName("Tom");Department d = new Department();d.setName("Design");p1.setDepartment(d);em.persist(p1);em.persist(d);}@PersistenceContextprivate EntityManager em; }
下面的代码来自Person.java。
package cn.w3cschool.common; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.TableGenerator;@Entity public class Person {@TableGenerator(name = "Address_Gen", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", pkColumnValue = "Addr_Gen", initialValue = 10000, allocationSize = 100)@Id@GeneratedValue(strategy = GenerationType.TABLE, generator = "Address_Gen")private long id;private String name;@OneToOneprivate Department department;public Person() {}public Person(String name) {this.name = name;}public Department getDepartment() {return department;}public void setDepartment(Department department) {this.department = department;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + "]";}}
以下代码来自App.java。
package cn.w3cschool.common;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");PersonDaoImpl dao = (PersonDaoImpl) context.getBean("personDao");dao.test();context.close();Helper.checkData();} }
以下是数据库表转储。
Table Name: ID_GENRow:Column Name: GEN_NAME,Column Type: VARCHAR:Column Value: Addr_GenColumn Name: GEN_VAL,Column Type: INTEGER:Column Value: 1Table Name: PERSONRow:Column Name: ID,Column Type: BIGINT:Column Value: 1Column Name: NAME,Column Type: VARCHAR:Column Value: TomColumn Name: DEPARTMENT_ID,Column Type: BIGINT:Column Value: 1