2012-03-14 55 views
2

我需要執行一個數據庫查詢序,以在許多額外的列「柱的順序」設置爲許多關聯表。所以我需要從Entity類中訪問數據庫序列,然後選擇sequence的nextval並將其分配給@prepersist生命週期回調方法中的order_by列。
如何訪問EntityManager的實體類中的EJB3

@Entity 
public class ProductWishlist implements Serializable 
{ 

.... 
@Column(name="ORDER_BIT") 
private long orderBit; 

// getter setter 
// ....... 

@Prepersist 
public void setOrderBit(EntityManager entityManager) 
{ 
    Query q=entityManager.createNativeQuery("select nextval('SHP_PRODUCTS_PICS_ORDER_SEQ')"); 
Long order=(Long)q.getResultList().get(0); 
this.setOrderBit(order); 

} 
} 

我怎麼能setOrderBit中訪問entitymanger從()?我如何將EntityManager傳遞給它? 或者我如何在一個Entity類中執行原生查詢?

回答

1

不應在預持續(或在一般的生命週期方法),因爲它不大聲根據規範中使用的EntityManager:

一般而言,便攜式應用的生命週期方法不應該 調用EntityManager或查詢操作,訪問其他實體或修改相同持久性 上下文中的關係。生命週期回調方法可以修改其被調用的實體的非關係狀態。

[43]這樣的操作的語義可能在將來的 釋放本說明書的被標準化。

剛剛獲得正常的JDBC連接,並用它來執行查詢。

2

在注入實體bean EntityManager不推薦。在我看來,充當POJO的實體bean用於層或網絡之間的數據傳輸。

它更好地預先填充實體,數據操作之前的持久性。但是可以在實體回調方法中對數據的屬性或格式進行一些驗證。

在這裏,你可以嘗試通過應用上的實體,它能夠順利通過實體生命週期回調方法通知@EntityListeners註釋使用實體監聽器。