首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MVP/MVC体系结构中使用有状态bean作为演示者/控制器是个好主意吗?

在MVP/MVC体系结构中使用有状态bean作为演示者/控制器是个好主意吗?
EN

Stack Overflow用户
提问于 2015-04-21 12:30:08
回答 2查看 124关注 0票数 1

我想要一个能够无缝访问持久化层的控制器,而EJB正是实现这一目的的一种不错的技术。我可以这样做:

代码语言:javascript
复制
@PersistenceContext
EntityManager em;

...    

Cat timmy = em.findById(Cat.class, "Timmy");
timmy.color = "red";

感觉就像提米在记忆中。可悲的是,这必须在业务级别进行,因为bean只是在业务级别。但是,事务应该在MVP的客户端级别上定义。这就是为什么我希望有一个主持人,这是一个@Stateful。通过这种方式,我可以在客户端级别启动和结束事务。不管怎么说,我有一种奇怪的感觉,那就是“国宝豆”是邪恶的,我宁愿不使用它们。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-21 15:17:51

终于我做到了!解决方案隐藏在CDI规范中:

代码语言:javascript
复制
@Inject CatRepository catRepository;

 @Transactional
 void changeColorToCat(String color, String catName) {
    Cat timmy = catRepository.findByName("Timmy");
    timmy.color = "red";
 }

一切都结束了!就像数据库根本不存在一样!

票数 0
EN

Stack Overflow用户

发布于 2015-04-21 13:09:11

这是:

代码语言:javascript
复制
@PersistenceContext
EntityManager em;

...

Cat timmy = em.findById(Cat.class, "Timmy");
timmy.setColor("red");
em.merge(timmy);

工作?

在架构方面,我使用@无状态的Dao

代码语言:javascript
复制
@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));
    }
}

所以在控制器里

代码语言:javascript
复制
    @Inject
    private CatDao dao;

    //...

    Cat cat = dao.find("Timmy");
    cat.setColor("red");
    dao.edit(cat);

你看..。无状态

Netbeans自动生成这个Dao,但称之为Facade (实体类的new>Other>Entreprise JavaBeans>session bean)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29772284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档