我只是在处理@EmbededId 代码,我想在实体被持久化之前进行自动增量,这是不使用@GeneratedValue 和标识列的情况,
下面是具有复合 id 的表,
create table TBL_EMPLOYEE_002(
ID integer,
COUNTRY varchar(50),
NAME varchar(50),
constraint PK_EMP_00240 primary key(ID,COUNTRY)
)
这是实体映射的代码,
@Entity
@Table(name="TBL_EMPLOYEE_002")
public class EmployeeEntitySix implements Serializable{
// contructor's
@EmbeddedId
private EmployeeIdTwo id;
@Column(name="NAME")
private String employeeName;
// getters and setter's
@PrePersist
public void incId(){
EntityManager em = null;
Query q = null;
EntityManagerFactory emf = null;
try{
emf = Persistence.createEntityManagerFactory("forPractise");
em = emf.createEntityManager();
q = em.createQuery("select max(e.id.employeeId) from EmployeeEntitySix e");
List list = q.getResultList();
Integer i = (list != null && list.size() > 0) ? Integer.valueOf(list.get(0).toString()) : 0;
this.getId().setEmployeeId(++i);
}catch(Exception e){
System.out.println("EXCETION WHILE INCREASING COUNTER...");
e.printStackTrace();
}finally{
if(em != null && em.isOpen()){
em.close();
}
if(getEmf() != null && getEmf().isOpen()){
getEmf().close();
}
}
}
这是复合id映射,
@Embeddable
public class EmployeeIdTwo implements Serializable{
@Column(name="ID")
private Integer employeeId;
@Column(name="COUNTRY",length=50)
private String empCountry;
// getters and setters
}
这段代码是我的主要方法,这个主要方法在其他类中,
public static void main(String [] args){
EntityManagerFactory emf = null;
EntityManager em = null;
EntityTransaction tx = null;
try{
emf = Persistence.createEntityManagerFactory("forPractise");
em = emf.createEntityManager();
tx = em.getTransaction();
tx.begin();
EmployeeEntitySix employee = new EmployeeEntitySix(new EmployeeIdTwo("ZIMBABWE"), "Henry Olanga");
em.persist(employee);
....
}
现在上面的代码运行良好,每当我持久化实体“EmployeeEntitySix”时,使用@PerPersist注释的方法就会运行,它将首先获取最大id,递增它,将其设置为嵌入实体中的id并持久化实体。
现在我的问题是,
我创建了 EntityManagerFactory 两次,第一次是在 main 方法中,第二次是在实体 EmployeeEntitySix 的 @PrePersist 方法中。因此,我是否可以使用在实体 EmployeeEntitySix 的 main 方法中创建的第一个 Entitymanagerfactory 而预先持久化,或者我是否可以重用第一次在实体的 @PrePersist 方法的 main 方法中创建的 entitymanager。
仅供参考,我使用的是纯 Java 环境,我没有使用 Java EE 容器。