0

Я использую Guice для Inject EntityManager. Когда я совершаю trasaction инъецируемого entityManager, в стороне BD ничего не происходит: транзакция не прошла !!! можете ли вы помочь мне разобраться, что происходит?Commit EntityManager Транзакция с использованием @Transactional - Guice

Вот мой код:

web.xml

<filter> 
    <filter-name>guiceFilter</filter-name> 
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
    <async-supported>true</async-supported> 
    </filter> 

    <filter-mapping> 
    <filter-name>guiceFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <listener> 
    <listener-class>ca.products.services.InjectorListener</listener-class> 
    </listener> 

InjectorListener класс:

public class InjectorListener extends GuiceServletContextListener { 
    @Override 
    protected Injector getInjector() { 

     return Guice.createInjector(
       new PersistenceModule(), 
       new GuiceModule(), 
       new RestModule()); 
    } 
} 

persistenceModule класс:

public class PersistenceModule implements Module { 
    @Override 
    public void configure(Binder binder) { 
     binder 
       .install(new JpaPersistModule("manager1") 
         .properties(getPersistenceProperties())); 

     binder.bind(PersistenceInitializer.class).asEagerSingleton(); 
    } 

    private static Properties getPersistenceProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.connection.driver_class", "org.postgresql.Driver"); 
     properties.put("hibernate.connection.url", "jdbc:postgresql://localhost:5432/postgres"); 
     properties.put("hibernate.connection.username", "postgres"); 
     properties.put("hibernate.connection.password", "postgres"); 
     properties.put("hibernate.connection.pool_size", "1"); 
     properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); 
     properties.put("hibernate.hbm2ddl.auto", "create"); 

     return properties; 
    } 
} 

GuiceModule с деваха:

public class GuiceModule extends AbstractModule { 

    @Override 
    protected void configure() { 

     bind(MemberRepository.class).to(MemberRepositoryImp.class); 
     bind(ProductRepository.class).to(ProductRepositoryImpl.class); 
     bind(ShoppingBagRepository.class).to(ShoppingBagRepositoryImpl.class); 
    } 
} 

RestModule класс:

общественного класса RestModule расширяет JerseyServletModule {

@Override 
    protected void configureServlets() { 

     HashMap<String, String> params = new HashMap<>(); 
     params.put(PackagesResourceConfig.PROPERTY_PACKAGES, "ca.products.services"); 
     params.put(JSONConfiguration.FEATURE_POJO_MAPPING, "true"); 
     params.put(ResourceConfig.FEATURE_DISABLE_WADL, "true"); 

     serve("/*").with(GuiceContainer.class, params); 
    } 
} 

и, наконец, вебсервис (jeresy) вызова:

@Inject 
    private Provider<EntityManager> em; 

    @GET 
    @Transactional 
    @Path("/reset") 
    public void resetData() { 

     logger.info("Processing reset"); 
     try { 

      em.get().getTransaction().begin(); 

      for (int i = 0; i < 10; i++) { 
       em.get().persist(new Product("Product_" + i, "Desc_" + i)); 
      } 
      em.get().flush(); 
      em.get().getTransaction().commit(); 

     } catch (Exception e) { 
      throw new WebApplicationException(Response.Status.FORBIDDEN); 
     } 
    } 

ответ

1

Вы, вероятно, нужно добавьте фильтр persist. Это также не позволит вам управлять транзакциями вручную. Если вы не используете фильтр, вы все равно можете вводить UnitOfWork для создания транзакций. Если вы используете jpa persist, вы не должны управлять userTransactions.

Это настраиваемый фильтр, который также добавляет жизненный цикл, который он автоматически запускал при запуске с помощью некоторого настраиваемого кода и компоновщика связующего. Это только для тщательности. Это не часть guice api, но больше похоже на слушателя Lifecycle весны. У меня вообще нет весенних зависимостей.

@Singleton 
public final class JpaPersistFilter implements Filter { 

    private final UnitOfWork unitOfWork; 
    private final PersistServiceLifecycle persistService; 

    @Inject 
    public JpaPersistFilter(UnitOfWork unitOfWork, PersistServiceLifecycle persistService) { 
     this.unitOfWork = unitOfWork; 
     this.persistService = persistService; 
    } 

    public void init(FilterConfig filterConfig) throws ServletException { 
     // persistService.start(); 
    } 

    public void destroy() { 
     persistService.stop(); 
    } 

    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, 
      final FilterChain filterChain) throws IOException, ServletException { 

     unitOfWork.begin(); 
     try { 
      filterChain.doFilter(servletRequest, servletResponse); 
     } finally { 
      unitOfWork.end(); 
     } 
    } 

    /** 
    * Extra lifecycle handler for starting and stopping the service. This 
    * allows us to register a {@link Lifecycle} with the 
    * {@link LifecycleListener} and not have to worry about the service being 
    * started twice. 
    * 
    * @author chinshaw 
    * 
    */ 
    @Singleton 
    public static class PersistServiceLifecycle implements Lifecycle { 

     private final PersistService persistService; 

     private volatile boolean isStarted = false; 

     @Inject 
     public PersistServiceLifecycle(PersistService persistSerivce) { 

      this.persistService = persistSerivce; 
     } 

     @Override 
     public boolean isRunning() { 
      return isStarted; 
     } 

     @Override 
     public void start() { 
      if (!isStarted) { 
       persistService.start(); 
       isStarted = true; 
      } 
     } 

     @Override 
     public void stop() { 
      persistService.stop(); 
      isStarted = false; 
     } 
    } 
} 

Пример добавления фильтра в модуль.

@Override 
protected void configureServlets() { 
    filter("/api/*").through(JpaPersistFilter.class); 
} 

Пример использования единицы работы для управления транзакцией.

@Inject 
UnitOfWork unitOfWork; 
public void doSomething() { 
    unitOfWork.begin(); 
    try { 
     dao.saveState(someobject); 
    } finally { 
     unitOfWork.end(); 
    } 
} 
+0

Привет, Крис, я добавил простой GuiceFilter, и он работает;): filter ("/ *"). Через (PersistFilter.class); Спасибо – taboubim

Смежные вопросы