簡體   English   中英

在MVP / MVC架構中使用有狀態Bean作為演示者/控制器是一個好主意嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM