2012-04-16 32 views
0

我是在企業應用程序中使用ORM工具的新手。我們正在構建一個使用JPA 2.0和EE6的可擴展應用程序。我試圖找到一個很好的模式來構建我的應用程序,但我找不到讓我的實體保持同步的方式(我想將訪問實體的bean集中在一起)。JPA2.0和EE6讓我的實體保持同步

一個例子:

我有一組:

@Entity 
public class Group implements Serializable 
{ 
    @Id 
    private Long id; 
    @OneToMany 
    private List<MyUser> myUsers; 

    public Group() 
    { 
    } 

    public Long getId() 
    { 
     return id; 
    } 

    public void setId(Long id) 
    { 
     this.id = id; 
    } 

    public void addUser(MyUser u) 
    { 
     myUsers.add(u); 
    } 
} 

而且我有一個用戶

@Entity 
public class MyUser implements Serializable 
{ 
    @Id 
    private Long id; 

    public MyUser() 
    { 
    } 

    public Long getId() 
    { 
     return id; 
    } 

    public void setId(Long id) 
    { 
     this.id = id; 
    } 

} 

現在,如果我想有一個無狀態的bean中添加或刪除用戶的組,我冒着讓無狀態bean的另一個實例擁有過時信息的風險。最佳做法是什麼?

+0

首先實施的解決方案,再後來檢查,如果任何情況下,豆類中含有過期的信息。 – Phani 2012-04-16 10:38:48

回答

5

我不確定你的設計問題到底是什麼,因爲無狀態bean不應該保持在狀態。您應該按需檢索用戶組,更新它,然後保留回數據庫。如果你實在擔心併發更新,需要更嚴格的控制,然後嘗試在你的實體使用鎖定模式:

  • JPA 1.0支持通過版本號 (OPTIMISTICOPTIMISTIC_FORCE_INCREMENT)樂觀鎖定。
  • JPA 2.0增加了悲觀鎖定(INCREMENTPESSIMISTIC_FORCE_INCREMENT

只使用悲觀鎖,如果你在你的系統中同一實體的爭高量的,因爲它沒有很好地擴展。

Additional Reading and Examples

+0

所以你說的是我不應該在內存中保存數據,但每次打電話時都要從數據庫中加載它? – Rob 2012-04-16 10:59:58

+0

是的,在這種情況下,肯定。您通常只會緩存超過***長時間的靜態數據。 – Perception 2012-04-16 11:06:48

+0

您應該讓JPA framwework緩存數據(使用第二級緩存)。否則,你正在重新發明輪子,再加上它可能是越野車。 – ewernli 2012-04-16 11:12:04