问题标签 [guice-persist]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
6001 浏览

jpa - Guice Persist 是否提供事务范围或应用程序管理的 EntityManager?

我们使用Guice Persist在我们的项目中注入 EntityManager。

例如

但是我们不清楚注入的实例将如何EntityManager被使用。

  1. 这是什么类型的EntityManager?(参见例如:实体管理器的类型) Guice Persist 通过实例化它,EntityManagerFactory.createEntityManager()所以我说它是应用程序管理的实体管理器。但是在官方 Wiki中,他们写了关于每次事务的 Seesion策略,这表明 EntityManager 是(伪)事务范围的。
  2. 我们应该手动调用 close()吗?还是 Guice 会处理它?
  3. 一级缓存的范围是什么?只有单个事务(如在事务范围的实体管理器中)还是只要我使用相同的注入实例EntityManager(如在应用程序管理的实体管理器中)?
0 投票
2 回答
1282 浏览

java - 带有 JPA、Eclipselink 和 Guice 的 NullPointerException

我有一个这样的 JpaController 类:

我正在安装一个com.google.inject.persist.PersistFilter(虽然没有过滤它,因为此时我不在 HTTP 请求中,它是一个后台线程)。

我还安装了一个new JpaPersistModule(PU)

我认为 EntityManager 已成功填充(尽管我对此没有信心,因为代码没有到达那条线)。

抛出的异常来自拦截器@Transactional

使用的库:EclipseLink 2.4.1、guice 3.0、guice-persist 3.0、guice-jndi 3.0、guice-servlet 3.0、MySQL 5.1.25、javax.persistence 2.0.4、Jackson、activemq、lombok、joda-time、javax。邮件、javax.inject、asm、jersey、log4j、jettison、jsr311。

0 投票
1 回答
1768 浏览

java - Guice-JPA persistance.xml 没有从属性文件中读取占位符

我正在使用带有休眠功能的 Guice-JPA 模块来执行 DAO 操作。

在persistence.xml 中对连接信息进行硬编码时,一切正常。但是当我尝试使用属性文件作为连接参数时,persistence.xml 只是将它们视为空字符串,我得到一个异常。

这是我的 guice 代码和 Persistense.xml。

在这段代码之后,我从调试器确认属性对象携带所有属性,所以我确定它正确读取了属性文件。

这是属性文件和persistence.xml

我得到以下异常:

请告知为什么 JPA 模块没有读取属性文件,知道它在没有占位符的情况下可以正常工作。

0 投票
0 回答
353 浏览

guice-servlet - 使用 guice-persist 时无法识别或保留对实体的更新

我在使用 guice-persist 和 guice-servlet(http-request 范围的 jpa 会话)时遇到问题,我尝试更新实体的值并持久化该更新,但更新从未持久化到数据库中。我尝试使用entityManager.flush()and强制写入entityManager.getTransaction().commit(),但是当我查看日志时,似乎什么也没有发生,即使 http 会话结束并释放 jdbc 连接也是如此。
我通常希望看到 hibernate 发出一个 sql update 语句,但更新似乎永远不会注册。令我感到奇怪的是,我创建新实体没有问题,这似乎只会影响更新。

我有一个单例范围的 servlet,它有一个注入的 UserDao,它使用注入的Provider<EntityManager>.

这是我的persistence.xml:

我已经使用 MySQL 和 Derby 数据库复制了这个问题。

以下是失败的更新尝试示例:

它需要一个DurableUser(在以前的 http 会话中创建 w/o 问题)并更新一个字段。即使有明确的flush()and commit(),hibernate 也不会发出更新语句。

我注意到在记录org.hibernate.internal.util.EntityPrinter用户的日志中toString(),它显示了更新的字段。这是否意味着 hibernate 确实识别出实体已被污染并且仍未保留更改?

谁能回答为什么我可以成功创建新实体但不能更新现有实体?到目前为止,我完全被难住了。

编辑:以下是会话的日志:

0 投票
1 回答
4449 浏览

caching - JPA 2 + EclipseLink:缓存问题

我对缓存和 JPA 实体(EclipseLink 2.4.1)+ GUICE PERSIST 有一个奇怪的行为

我不会使用缓存,但 我会随机获得一个在 MySQL 数据库中已经更改的旧实例。

我尝试了以下方法:

  1. 将@Cacheable (false) 添加到JPA 实体。

  2. 在 persistence.xml 文件中禁用缓存属性:

即使激活跟踪 EclipseLink,我也看到了 JPQL 查询:

ReadObjectQuery 执行查询(name = "readObject" referenceClass = XX sql = "... (只是打个电话" find "entityManager

但是,但是,随机返回该类的旧值。

笔记

使用不同的 EntityManager 实例可能会发生并且每个人都有自己的缓存?我看过以下相关帖子:禁用 JPA EclipseLink 2.4 缓存如果是这样,可以在不使用的情况下清除所有 EntityManager 的缓存:???? em.getEntityManagerFactory().getCache().evictAll(); 是否可以在不使用 evictALL 的情况下清除所有缓存?

0 投票
3 回答
1349 浏览

guice - createInjector 上的奇怪错误“无法拦截方法”

我对 guice 有一些经验,我只是尝试了 guice-persist。但是现在我在非常简单的模块中遇到了一个非常奇怪的错误。这是我的模块:

我创建了一个工厂(这是为了使用这个 api,没有 main)来获取服务的实例:

VotingService 及其实现封装了简单的数据库交互。对于这个 "VotingServiceImpl" 只注入一个 EntityManager 并在某些方法上使用 @Transactionl。那么为什么我得到

? 在这个简单的测试中会抛出错误:

编辑 仅当绑定实现使用@Transactional 时才会发生此错误。所以aop的东西出了点问题,但是如何解决呢? 编辑

0 投票
2 回答
2201 浏览

java - @Transactional 注释未启动事务(Guice Persist)

我正在尝试使用 Guice Persist 创建一个带有 @Transactional 注释方法的简单服务类:

不幸的是,Guice Persist 没有创建任何交易。日志输出可以在这里看到:http: //pastebin.com/Mh5BkqSC

注意第 450 行的打印:

交易是否活跃?错误的

结果是数据库中没有存储任何内容:

我通过以下方式设置应用程序:

如您所见TestService,它是由 Guice 创建的,我使用的是JpaPersistModule,这应该是@Transactional接线的原因。

我创建了一个小型 Maven 项目来演示该问题:https ://github.com/uldall/guice-persist-error

0 投票
1 回答
977 浏览

hibernate - JPA @ElementCollection 神秘地缓存

我的 POJO(名为 Category)有一个langMap(Language Map) ,它存储Locale -> String映射。它定义为:

在我更新地图之前它运行良好:代码很简单:

清除所有langMap并输入新值。(当然,它是@Transactionalmerge() )

但是,当我刷新视图层时,有时会看到旧地图的结果。我确定我没有添加任何缓存层。

这是我看到的:

例如,有一个类别存储

在 mysql 中正确显示:

在视图层中,我特意为每个名称添加了“X”:

在此处输入图像描述

提交后,它正确地替换了旧地图,并且在 mysql 中,值被真正修改:

但是当我重新加载此类页面时,我偶尔会看到显示的旧地图(并非总是如此,大约 50/50):

日志写入域对象 ( Category),而不是视图层。每次刷新都会触发 POJO 中的日志。所以我确信视图层没有缓存任何东西。

似乎有一个过时langMap的没有从内存中清除,hibernate偶尔会得到那个版本。如果我再修改一下,就会有3个版本的地图随机旋转……很奇怪。

只有重新启动服务器才能始终得到正确的langMap.

这里有什么问题?

环境 :

- - - - - - 更新 - - - - - -

出于好奇,我想知道是否CategoryDao.get(1)真的命中了 db。我打开hibernate.show_sql=true,添加一些登录CategoryDao.get(1),然后重新运行进程。

结果:

每次get()触发记录器,但是,正如预期的那样,旧数据没有显示 SQL 日志。看来他们没有打分贝。有时最新数据未显示 SQL 日志。无论如何,如果它显示 SQL 代码,结果肯定是最新的。

这似乎是一个缓存问题。但我在这里没有使用任何缓存(包括 ehcahce)。我什至将hibernate.cache.use_query_cache, and设置hibernate.cache.use_second_level_cache为 false ,但徒劳无功。

这里有什么问题?

------------ 更新2 ------------

在评论中,我认为我通过介绍@TransactionalDAO 的get(id)方法来解决问题。但它仅在整个(网络)操作仅检索 category 时才有效。例如,以下是可以的:

它运行良好,无论我如何修改类别langMaplangMap都正确存储到 db 并从 db 检索。我看到了 SQL,每一个都get(id)真正击中了数据库。

但实际上,这个动作一般不会只渲染一个类别对象。例如,我有其他查询subCategories,或类别下的项目:

这样的动作看起来还可以,离线测试也可以。但是上网的时候,更新分类后langMap,神秘的缓存langMap有时又会浮起来(WTF!)。而且categoryDao.get(id)也不总是击中 DB 。

那么,这里可能有什么问题?

0 投票
1 回答
1574 浏览

jpa - TransactionRequiredException:没有交易正在进行 Jersey + Guice + JPA

按照本教程使用 Guice 3.0:https ://code.google.com/p/google-guice/wiki/JPA

GuiceModule 类:

JPAInitializer.class

控制器类:

和堆栈跟踪:

javax.persistence.TransactionRequiredException:在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332) 的 org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171) 没有事务正在进行com.drone.mission.controller.MissionController.newMission(MissionController.java:37) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect。 DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81 ) 在 org.glassfish.jersey。server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171) at org.glassfish.jersey.server.model .internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker .invoke(ResourceMethodInvoker.java:406) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:350) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:106)在 org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:259) 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 在 org.glassfish.jersey.internal .Errors$1.call(Errors.java:267) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297)在 org.glassfish.jersey.internal.Errors.process(Errors.java:267) 在 org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:320) 在 org.glassfish.jersey.server.ServerRuntime .process(ServerRuntime.java:236) 在 org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028) 在 org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373) 在 org. glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:219) 在 org.apache.catalina.core.ApplicationFilterChain .internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke( StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:122) 在 org.org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 的 apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java) org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java: 170) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 在 org.apache.catalina.valves.AccessLogValve.invoke 的 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java) (AccessLogValve.java:950) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache。 coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler。进程(AbstractProtocol.java:607)在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java .util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:744)

我究竟做错了什么?

谢谢

0 投票
1 回答
1511 浏览

java - jpa2 使用 guice 重用 entityManager

我有一个 Web 应用程序,它有一些奇怪的行为,我无法真正理解。我的问题的核心是我的休息端点返回的值存在不一致的行为。当我启动我的应用程序时,每次调用此端点时,我的查询都会返回相同的值。当我更新实体时,我的实体管理器开始表现异常。现在我的查询开始返回不同的结果。有一次它返回旧值而不是数据库中的值,或者我的结果列表包含代理而不是对象(混合)。 在此处输入图像描述

我已经验证了我的@transaction 方法放置正确,并且在我的调试堆栈中,我看到了事务拦截器,并且根据对后端的请求创建了实体管理器(因此没有 guice 持久性过滤器)

我的感觉表明问题出在会话上下文中。我有一种感觉(但我无法真正理解)它在多个请求上重用了我的持久性上下文。

我已经将一些框架放在一起以使这一切正常工作。我使用 resteasy 作为 jax-rs 实现者。guice (4.0beta4) 作为 cdi 实现者,hibernate 作为 jpa 实现者。因为我们在注入 entitymanager 时需要使用提供程序(因为每个事务都会创建 entitymanager),所以我将其包装在 EntityManagerProxy 中。此类实现 EntityManager 接口并将所有方法委托给 provider.get().method()。

我的 guice 模块看起来像这样

我知道这是一个模糊的问题,但有人可以帮助我朝着正确的方向前进吗?这不是我可以提供错误消息的真正问题。

编辑:我现在指出了问题所在。使用探查器,我查看了实体上下文被 guice 重用。这意味着它不是每次都执行查询,而是使用现有的实体管理器,每次传递 @transactional 注释时都应该创建它。