Does Guice Persist provide transaction scoped or application managed EntityManager?

前端 未结 4 1896
清酒与你
清酒与你 2020-12-09 17:10

We use Guice Persist to inject EntityManager in our project.

E.g.

public class MyDao{
   @Inject
   EntityManager em;

   public void someMethod(){
          


        
4条回答
  •  天涯浪人
    2020-12-09 17:49

    1. It depends on you module cofiguration. There are some basic bindings:

    JpaPersistanceService

    public class JpaPersistanceService implements Provider {
    
      private EntityManagerFactory factory;
    
      public JpaPersistanceService(EntityManagerFactory factory) {
        this.factory = factory;
      }
    
      @Override
      public EntityManager get() {
        return factory.createEntityManager();
      }
    }
    

    Module binding

    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;
    

    Usage

    @Inject @Named("request")
    private EntityManager em; //inject a new EntityManager class every request
    
    @Inject @Named("session")
    private Provider 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. Yes, you should or you will use JpaPersistModule [javadoc]

    3. Well, this is about JPA configuration in persistence.xml and EntityManager scope

提交回复
热议问题