如何確定適用於像下面這樣的JPA存儲庫的CDI範圍?哪個CDI範圍應該是首選的JPA存儲庫
@Transactional
public class CategoryRep extends EntityRepository<Integer, Category> {
private static final long serialVersionUID = 856370976984333182L;
public List<Category> getAllCategories() {
// TODO
}
public List<Post> getAllPostsOfCategory(Integer categoryId) {
// TODO
}
@Transactional(value = TxType.REQUIRES_NEW, rollbackOn = RuntimeException.class)
public void createCategory(final String name, final String description)
throws DaoJpaException {
// TODO
}
}
我能想到的只有兩個CDI作用域:
- @SessionScope: 對我來說,這似乎是最合適的範圍,因爲一個實例是專門爲活動會話。
- @依賴: 也是合理的,因爲這樣的實例將適合它將被注入的對象的生命週期。
所有其他CDI-範圍是不是在我看來適當的:
- @ApplicationScoped:由於應用範圍的倉庫將被創建了一次,一時間,就像一個電話:
entityManager.clear()
會引起所有當前會話的所有實例也將被分離。另外,這個單個存儲庫必須處理所有傳入的請求。這個範圍可能適用於只讀存儲庫嗎? - @RequestScope:我認爲沒有必要爲每個到來的請求新的存儲庫實例。
- @ConversionScoped:轉化是在GUI層通常執行。如果我希望存儲庫在轉換結束後死掉,我可以將其定義爲
@Dependent
。
那麼,有沒有知道這個問題的最佳做法?
謝謝@ @ Version'屬性是否通過使用@ ApplicationScoped來解決併發問題? – 2014-10-08 10:04:07
說實話,我不確定,因爲javadoc只會談論保持完整性,而合併實體,在我看來,這是不夠的。 – 2014-10-08 10:28:25
我認爲樂觀和悲觀鎖定的使用應該解決併發問題。 – 2014-10-09 19:42:36