我正在使用 Java SE 7 开发桌面应用程序。该应用程序使用多个线程,并在创建的每个线程中注入一个 DAO 类以访问我的数据库。作为持久层,我使用的是 EclipseLink 和 JPA。EntityManager 使用构造函数注入注入到我的 DAO 类中,并且由于它不是线程安全的,因此我采用了这样的 Provder 方法:
public PluginInstanceJpaController implements IPluginInstanceDao {
private EntityManager em;
@Injected
public PluginInstanceJpaController(Provider<EntityManager> emp) {
this.em = emp.get();
}
@Transactional
public void create(PluginInstance foo) throws Exception {
em.persist(foo);
}
}
但是,相同的 EntityManager 实例被注入到每个 DAO 中。为了进行设置,我使用了 guice 提供的 JpaPersistModule,我确信到目前为止我的设置中没有单例。
有谁知道在注入时如何告诉 guice 创建 EntityManager 的新实例?
在另一种方法中,我尝试了 EntityManagerFactory 和 EntityManager 的自定义提供程序,并将 JpaPersistModule 排除在我的业务之外。这导致每个 DAO 都有一个 EntityManager 实例,但是 @Transactional 注释的方法没有被拦截。
我很感激这个问题的任何解决方案。到目前为止感谢!
- - 编辑 - -
DAO 类被注入到使用它们的 Runnable 中。Runnable 也通过 Provider 提供。我的模块配置如下所示:
public class RepositoryModule extends AbstractModule {
@Override
protected void configure() {
// DAO bindings
bind(IObjectStoreDao.class).to(ObjectStoreJpaController.class);
bind(IPluginInstanceDao.class).to(PluginInstanceJpaController.class);
}
@Provides
public PluginMonitor newMonitor(IPluginInstanceDao plugDao, IObjectStoreDao osDao) {
PluginMonitor m = new PluginMonitor();
m.setPluginInstanceDao(plugDao);
m.setObjectStoreDao(osDao);
return m;
}
}
这里 PluginMonitor 是我的 Runnable。注射器本身是在我的主线程中创建的......这可能是问题吗?