,我只是工作在@EmbededId代碼,我想要的實體堅持之前做一個自動遞增,這是希望在不使用@GeneratedValue和標識列做,重用持久化上下文在JPA
下面是複合的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的兩倍, 首先在主要方法,在實體EmployeeEntitySix的@PrePersist方法 第二次。因此,無論我是否可以使用實體EmployeeEntitySix中的main方法中創建的第一個Entitymanagerfactory,同時預留,還是我可以重複使用實體中的@PrePersist方法中main方法中第一次創建的entitymanager。
僅供參考,我使用純java環境,我沒有使用Java EE容器。
您沒有顯示getEMF()的功能,但是如果它是靜態的,在持續回調中關閉EMF並且提供程序正在使用時可能不是個好主意它 – Chris 2013-04-05 11:29:12
但我的問題是,我將如何重用EmtityManager,我已經在主要方法中創建,在@PrePersist方法 – 2013-04-05 11:32:09