我已经在我的应用程序中以相同的方式使用了本教程:http : //www.benmccann.com/hibernate-with-jpa-annotations-
and-guice/
我的应用程序是JAX-RS Web服务,它将接收许多并发请求并进行数据库更新。
GenericDAOImpl.java实现:
public class GenericDAOImpl<T> implements GenericDAO<T> {
@Inject
protected EntityManager entityManager;
private Class<T> type;
public GenericDAOImpl(){}
public GenericDAOImpl(Class<T> type) {
this.type = type;
}
@Override
public void save(T entity) {
entityManager.getTransaction().begin();
entityManager.persist(entity);
entityManager.getTransaction().commit();
}
}
如果2个并发线程尝试保存实体,我得到
java.lang.IllegalStateException: Transaction already active
如果我评论交易,保存效果很好。
我尝试使用
@Inject
protected Provider<EntityManager> entityManagerProvider;
要么
@Inject
protected EntityManagerFactory entityManagerProvider;
并针对每个请求:
EntityManager entityManager = entityManagerProvider.get()
但是然后我得到:
org.hibernate.PersistentObjectException: detached entity passed to persist
什么是实现Guice + Hibernate EntityManager注入/线程安全的通用DAO类的正确方法?
更新
来自http://www.benmccann.com/hibernate-with-jpa-annotations-and-
guice/的
Andrew Rayner评论
“逻辑还不是真正可以投入生产的-至少在Web应用程序中使用了。
Hibernates连接池是非常基本的,并且尚未准备就绪,建议使用数据源池,例如c3p0。
EntityManager不应被重用-它应按事务/请求创建。很可能污染后续请求。
如果出现问题,也不会进行事务回滚。
一种有趣的方法–但是对于Web应用来说,使用Guices自己的Persist扩展模块来管理EntityMananger实例和事务的生命周期会更加安全。”
问题是我的端点被@Singleton注释,因此它在并发调用期间重用了相同的EntityManager。删除@Singleton之后,在并发调用期间,将使用不同的EntityManager对象。如果端点调用是后续的,则可能是将使用先前的/旧的EntityManager。
高度简化的示例:
@Path("/v1/items")
public class ItemsService {
@Inject
private EntityManager entityManager;
@POST
@Path("/{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void saveItem(){
entityManager.getTransaction().begin();
entityManager.persist(new Item());
entityManager.getTransaction().commit();
}
}
我正在使用JavaSE7开发一个桌面应用程序。应用程序使用多个线程,在创建的每个线程中,都会注入一个DAO类来访问我的数据库。作为持久层,我使用EclipseLink和JPA。EntityManager是使用构造函数注入注入注入到我的DAO类中的,因为它不是线程安全的,所以我使用了如下验证程序: 然而,相同的EntityManager实例被注入到每个DAO中。为了进行设置,我使用了由guice提供
我正在重构一个遗留的Java代码库,以向泽西资源类提供Guice驱动的依赖注入。 这是一个精简的应用程序,它使用传统的Jetty/泽西设置(请参阅 我无法理解各种组件以及它们是如何协同工作的。因此,我不断得到以下错误: 如果我在< code>FooResource的构造函数中直接访问Guice注入器,它就会工作。这告诉我Jetty/Jersey的东西被正确地设置来服务资源,Guice能够正确地构建
我试图使用Guice将依赖项注入到通过DynamicFeature注册的ContainerRequestFilter中。我还需要Jersey注入HttpServletRequest,我目前正在尝试通过@context实现这一点。这是在一个Dropwizard应用程序中。 我的最终目标是拥有一个通过DynamicFeature应用于特定资源的AuthenticationFilter。我的Authen
问题内容: 我在这里谈论基本用法: 谷歌搜索以上问题,说是,但不是 -接受的答案是,是,但后续行动是否;Spring.io表示是和否,并且似乎是Java EE专家的Adam Bien给出了不合格的yes。 我对一个简单的调度bean的经验表明答案是否定的: 抽象界面: 开始于: 如果我打印出,即使我在两次调用之间仍在同一线程上,也会得到: 严重:java.lang.IllegalStateExce
Hibernate EntityManager实现了EJB3.0 JPA规范。Hibernate Java Persistence provider通过了Sun TCK测试和完全认证,你可以在Java SE 5.0,或Java EE 5.0以上的任何环境里使用Hibernate Java Persistence provider。 Hibernate是一个非常优秀的持久层ORM(Object/Re
问题内容: 我知道会话不是线程安全的。我的第一个问题:将实体传递给另一个线程,对它做一些工作,然后将其传递回原始线程并进行更新,是否安全? 我的第二个问题:在一个线程中创建一个实体并将其保存在另一个线程中是否安全? 编辑 我忘了提到实体是为快速加载而专门配置的 问题答案: 否。该实体已附加到会话中,并包含链接到该会话的代理(以延迟自身加载)。因此,这样做将使用多个线程中的会话。由于会话不是线程安全