我想要一个能够无缝访问持久化层的控制器,而EJB正是实现这一目的的一种不错的技术。我可以这样做:
@PersistenceContext
EntityManager em;
...
Cat timmy = em.findById(Cat.class, "Timmy");
timmy.color = "red";感觉就像提米在记忆中。可悲的是,这必须在业务级别进行,因为bean只是在业务级别。但是,事务应该在MVP的客户端级别上定义。这就是为什么我希望有一个主持人,这是一个@Stateful。通过这种方式,我可以在客户端级别启动和结束事务。不管怎么说,我有一种奇怪的感觉,那就是“国宝豆”是邪恶的,我宁愿不使用它们。
发布于 2015-04-21 15:17:51
终于我做到了!解决方案隐藏在CDI规范中:
@Inject CatRepository catRepository;
@Transactional
void changeColorToCat(String color, String catName) {
Cat timmy = catRepository.findByName("Timmy");
timmy.color = "red";
}一切都结束了!就像数据库根本不存在一样!
发布于 2015-04-21 13:09:11
这是:
@PersistenceContext
EntityManager em;
...
Cat timmy = em.findById(Cat.class, "Timmy");
timmy.setColor("red");
em.merge(timmy);工作?
在架构方面,我使用@无状态的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 (实体类的new>Other>Entreprise JavaBeans>session bean)
https://stackoverflow.com/questions/29772284
复制相似问题