GWT-P + JPA Hibernate EntityManager

时间:2011-11-08 13:22:04

标签: hibernate gwt jpa guice entitymanager

我正在尝试在GWT-P应用程序中使用Hibernate的EntityManager

不幸的是,我似乎无法使用建议的PersistFilter

public class MyModule extends ServletModule {
  protected void configureServlets() {
    install(new JpaPersistModule("myJpaUnit"));  // like we saw earlier.
    filter("/*").through(PersistFilter.class);
  }
}

导致ClassCastException

org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider cannot be cast to org.hibernate.service.jdbc.connections.spi.ConnectionProvider

所以我正在尝试其他方法(除非你有这个建议)。

我必须非常接近第一个服务,但注入的EntityManager总是null

public class ImageMetaDataService {
    @Inject EntityManager em;
    @Transactional
    public void createNewImageMetaData(ImageMetaDataImpl imd) {
        em.persist(imd);
    }
}

我怀疑我在设置中犯了错误。使用install(new JpaPersistModule("name"));DispatchServletModule)与添加JpaPersistModule是否存在差异:

public class MyGuiceServletContextListener extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServerModule(), new DispatchServletModule(), new JpaPersistModule("name"));
    }
}

最后我最重要的问题是:我将如何开始JPA。文档建议这样的类:

public class MyInitializer { 
        @Inject MyInitializer(PersistService service) {
                service.start(); 
                 // At this point JPA is started and ready.
        } 
}

但我不知道怎么做(在GWT-P中)。

1 个答案:

答案 0 :(得分:0)

关于“最重要的问题”,MyGuiceServletContextListener是一个ServletContextListener。重写

的默认实现
public void contextInitialized(ServletContextEvent servletContextEvent) {
        persistService = injector.getInstance(PersistService.class);
        persistService.start();
}

然后你想要实现contextDestroyed来停止服务:

@Override
public void contextDestroyed(ServletContextEvent contextEvent) {
    if (persistService != null) {
        persistService.stop();
    }
}

在这两种方法中,在从getInjector()方法返回之前,注入器变量在本地缓存。