我正在尝试在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中)。
答案 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()方法返回之前,注入器变量在本地缓存。