![](/img/trans.png)
[英]Is it a good idea to open a hibernate session in controller in MVC architecture?
[英]Is it a good idea to use a stateful bean as a presenter/controller in a MVP/MVC architecture?
我想要一個能夠無縫訪問持久性層的控制器,而EJB是一個很好的技術。 我可以做這樣的事情:
@PersistenceContext
EntityManager em;
...
Cat timmy = em.findById(Cat.class, "Timmy");
timmy.color = "red";
感覺就像是在記憶中。 可悲的是,這必須在業務級別上完成,因為bean僅在業務級別上。 但是,應在MVP的客戶端級別定義事務。 這就是為什么我想要一個Presenter是@Stateful bean。 這樣,我可以在客戶端級別開始和結束事務。 無論如何,我有一種奇怪的感覺,即@Stateful bean是邪惡的,我寧願不使用它們。
就是它:
@PersistenceContext
EntityManager em;
...
Cat timmy = em.findById(Cat.class, "Timmy");
timmy.setColor("red");
em.merge(timmy);
工作?
在架構方面,我使用@Stateless Dao
@Stateless
public class CatDao extends Dao<Cat> {
public CatDao () {
super(Cat.class);
}
}
public class Dao<E> {
@PersistenceContext(unitName = "myappPU")
private EntityManager em;
private final Class<E> entityClass;
protected Dao(Class<E> entityClass) {
this.entityClass = entityClass;
}
public E find(Object id) {
return em.find(entityClass, id);
}
public List<E> findAll() {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
Query q = entityManager.createQuery(cq) ;
return q.getResultList();
}
public void create(E entity) {
em.persist(entity);
}
public void edit(E entity) {
em.merge(entity);
}
public void remove(E entity) {
em.remove(entityManager.merge(entity));
}
}
所以在控制器中
@Inject
private CatDao dao;
//...
Cat cat = dao.find("Timmy");
cat.setColor("red");
dao.edit(cat);
看...無狀態
Netbeans自動生成此Dao,但將其稱為Facade(新的> Other> Entreprise JavaBeans>實體類的會話bean)
終於我做到了! 該解決方案隱藏在CDI規范中:
@Inject CatRepository catRepository;
@Transactional
void changeColorToCat(String color, String catName) {
Cat timmy = catRepository.findByName("Timmy");
timmy.color = "red";
}
完成了! 就像數據庫根本不存在!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.