2013-07-23 57 views
1

我在摸索周圍使用JPA的中間。到目前爲止,我已經成功地創建了一個表示用戶數據的實體和一個用於訪問用戶數據的無狀態bean。使用JPA註解發表審計功能

用戶可以工作的數據是這樣的(SQLFiddle link):

CREATE TABLE data 
(
    email character varying(128) NOT NULL, 
    data character varying(128) NOT NULL, 
    lastchange timestamp NOT NULL, 
    CONSTRAINT email_data PRIMARY KEY (email,data) 
); 

的想法是保存不變,當前版本爲所有用戶提供了一個空email關鍵。然後,當用戶更改數據並創建可審計版本時,email字段將填充用戶電子郵件。這樣,每個用戶都可以更改他們的數據副本。合併是以後的一個問題,而不是我的問題的一部分。

現在,我有實體已經到位。我創建了一個無狀態bean來使用EntityManager加載/保存/查找數據記錄。首先加載用戶特定版本的邏輯,然後在用戶沒有用戶特定版本的情況下加載未改變版本的邏輯仍然沒有解決。

考慮bean的這一部分:

@Stateless 
public class DataBean { 

    @PersistenceContext(unitName = "authPU") 
    private EntityManager em; 

    public List<DataEntry> findAll() { 
     TypedQuery<DataEntry> query = em.createQuery("SELECT d FROM data d", DataEntry.class); 
     List<DataEntry> list = query.getResultList(); 
     return query.getResultList(); 
    } 

    ... 
} 

如何注入用戶信息到這個班?我需要首先獲取當前用戶的數據,然後在沒有可用的用戶特定數據的情況下獲取所有用戶的數據。

+0

「選擇數據*」 不是JPQL。 – DataNucleus

+0

我修改了代碼。 – 0xCAFEBABE

+0

您正在發佈的查詢會返回所有數據。如果您僅僅是針對特定電子郵件的數據,那麼您是否應該傳遞該電子郵件並查詢它? 「其中d.email爲空或d.email =:電子郵件」?這也可能不是你想要的,因爲數據不會是唯一的。但我不明白爲什麼你有數據作爲PK的一部分 - 它不應該只是電子郵件地址嗎?數據意味着正在改變的東西,而主鍵值永遠不會改變。建議使用PK的序列值。 – Chris

回答

0

你可以使用標準的EJB認證。然後,您可以在會話bean中調用SessionContext.getCallerPrincipal()以獲取用戶標識。使用此用戶標識查詢數據庫。

在這種情況下,你必須另一列添加到您的表(包含用戶ID),如果認證用戶ID不等於電子郵件地址。

更簡單(但不太高雅)是將電子郵件地址添加到您的EJB的服務方法的參數:只要讓公衆API的一部分。