1. モジュール構成によって異なります。いくつかの基本的なバインディングがあります:
JpaPersistanceService
public class JpaPersistanceService implements Provider<EntityManager> {
private EntityManagerFactory factory;
public JpaPersistanceService(EntityManagerFactory factory) {
this.factory = factory;
}
@Override
public EntityManager get() {
return factory.createEntityManager();
}
}
モジュールバインディング
EntityManagerFactory factory = Persistence.createEntityManagerFactory(getEnvironment(stage));
bind(EntityManager.class).annotatedWith(Names.named("request")).toProvider(new JpaPersistanceService(factory)).in(RequestScoped.class);
bind(EntityManager.class).annotatedWith(Names.named("session")).toProvider(new JpaPersistanceService(factory)).in(SessionScoped.class);
bind(EntityManager.class).annotatedWith(Names.named("app")).toProvider(new JpaPersistanceService(factory)).asEagerSingleton;
使用法
@Inject @Named("request")
private EntityManager em; //inject a new EntityManager class every request
@Inject @Named("session")
private Provider<EntityManager> emProvider; //inject a new EntityManager class each session
//This is little bit tricky, cuz EntityManager is stored in session. In Stage.PRODUCTION are all injection created eagerly and there is no session at injection time. Session binding should be done in lazy way - inject provider and call emProvider.get() when em is needed;
@Inject @Named("application")
private EntityManager em; //inject singleton
2. はい、JpaPersistModule [javadoc]を使用する必要があります。
3.さて、これはpersistence.xmlとEntityManagerスコープのJPA構成についてです