- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 spring、jpa 2.0 和带注释的 PersistenceContext
EntityManager
进行简单的容器管理事务。
下面是我的 app-context.xml(spring 配置):
<beans ...>
<context:annotation-config />
<context:component-scan base-package="com.example.test.config" />
<context:component-scan base-package="com.example.test.controllers" />
<context:component-scan base-package="com.example.test.services" />
<jee:jndi-lookup id="myDS" jndi-name="jdbc/myDS" expected-type="javax.sql.DataSource" />
<bean id="myEMF" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="testPU"/>
<property name="packagesToScan" value="com.example.test.model"/>
<property name="jtaDataSource" ref="saturnDS"/>
<property name="mappingResources" value="META-INF/orm.xml" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" />
</property>
</bean>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="myEMF" />
<property name="dataSource" ref="myDS" />
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
我在 com.example.test.services 中有一个名为 MyServiceImpl 的服务:
@Repository("myService")
@Transactional
public class MyServiceImpl implements MyService{
@PersistenceContext(unitName = "testPU")
@Qualifier("myEMF")
private EntityManager em;
@Override
public String getMessage() {
return "Hello, World!";
}
@Override
public Customer getFirstCustomer() {
CustomerId id = new CustomerId();
id.setId(new BigInteger("1"));
id.setStartVersion(1);
return em.find(Customer.class, id); // it uses a composite key
}
}
当我尝试使用注入(inject)到 mvc Controller 中的 bean 调用 getFirstCustomer() 方法时出现以下错误(为简洁起见未显示):
更新:这里是完整的堆栈跟踪:
[14/05/14 11:01:20:812 EST] 0000008f webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[DispatcherServlet]: org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is <openjpa-2.2.2-SNAPSHOT-r422266:1462076 nonfatal user error> org.apache.openjpa.persistence.InvalidStateException: You cannot access the EntityTransaction when using managed transactions.
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:430)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:420)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:257)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy525.getMessage(Unknown Source)
at com.example.test.controllers.IndexController.showIndex(IndexController.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
at java.lang.reflect.Method.invoke(Method.java:613)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:575)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1227)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:776)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:458)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1032)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3761)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:976)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:283)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1862)
Caused by: <openjpa-2.2.2-SNAPSHOT-r422266:1462076 nonfatal user error> org.apache.openjpa.persistence.InvalidStateException: You cannot access the EntityTransaction when using managed transactions.
at org.apache.openjpa.persistence.EntityManagerImpl.getTransaction(EntityManagerImpl.java:552)
at org.apache.openjpa.persistence.EntityManagerImpl.getTransaction(EntityManagerImpl.java:102)
at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:67)
at org.springframework.orm.jpa.vendor.OpenJpaDialect.beginTransaction(OpenJpaDialect.java:50)
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380)
... 49 more
我正在使用 WebSphere v8.5.5.0 和 Spring 4.0.4
如果这是我应该知道的基础知识,请原谅我,我只希望注入(inject)的 EntityManager 对我的交易目的有效。
更新:因为我使用的是 websphere,所以我需要一个从容器中获取的 transactionManager。我已将我的 transactionManager 引用换成以下内容:
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager" />
但是现在应用程序提示说 Customer 类没有得到增强,而它肯定在 EMF 的“packagesToScan 属性中”。
更新:这是我的实体类:(注意我使用的是 lombok,它为我生成样板文件。
package com.example.test.model;
import ...;
@Entity
@Getter
@Setter
@Table(name = Rep.TABLE_NAME)
@IdClass(CustomerId.class)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode
public class Customer implements Serializable {
public static final String TABLE_NAME = "Customer";
public static final String ID_COLUMN = "CUSTOMERID";
public static final String START_VERSION_COLUMN = "STARTVERSION";
/* etc */
@Id
@Column(name = ID_COLUMN, nullable = false, insertable = true, updatable = true, precision = 0)
private BigInteger id;
@Id
@Column(name = START_VERSION_COLUMN, nullable = false, insertable = true, updatable = true)
private int startVersion;
/* etc ad. nauseum */
}
最佳答案
我已经找到了解决方案,在研究答案的过程中我学到了一些东西。
首先,因为我使用的是 Websphere,事务管理器已经由容器提供。这可以像这样在我的配置中声明为一个 bean:
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager" />
transactionManager
是 <tx:annotation-driven />
的默认名称标记寻找初始化它的事务管理器(否则由 transaction-manager
属性指定。
其次,spring容器不会在运行时自动转换实体类,要指定这个需求就意味着要加一个LoadTimeWeaver
到 LocalContainerEntityManagerFactoryBean
声明:
<bean id="myEMF" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="loadTimeWeaver">
<!-- Spring provides a websphere compatible load time weaver -->
<bean class="org.springframework.instrument.classloading.websphere.WebSphereLoadTimeWeaver" />
</property>
....
</bean>
现在这两个元素都已到位,该函数从方法调用中优雅地返回所需的 Customer 对象 :)
关于java - Spring org.apache.openjpa.persistence.InvalidStateException : you cannot access the EntityTransaction when using managed transactions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23644216/
查看在数据库中执行的 SQL 查询的 OpenJPA 配置是什么?我想查看在日志或控制台中执行的所有参数的查询,而不是查看 JPQL 查询 最佳答案 启用所有 SQL 语句的日志记录,减去参数值。
我创建了一个包含一张表的数据库:users DROP DATABASE IF EXISTS DB_TEST; CREATE database DB_TEST; USE DB_TEST; -- ----
任何人都可以解释为什么我会收到此错误(下面的完整堆栈跟踪): Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: You hav
在 Open JPA 注释处理器/maven 插件上收到此警告?有什么问题吗?在另一个项目中我没有收到此警告。 [WARNING] diagnostic: warning: The following
我试图为使用 Apache TomEE Maven 插件开发的 Java Enterprise Web 应用程序编写测试。该应用程序运行良好,一切似乎都正常运行。我考虑使用 JUnit Jupiter
我在使用 SQLite 的 JPA 中遇到此错误,我不知道为什么会出现这种情况,有帮助吗? 我的 persistence.xml: org.apache.openjpa.
我正在尝试将应用程序从 WLP 迁移到 Tomcat,在尝试部署 war 时,出现以下异常 org.apache.openjpa.persistence.ArgumentException:此配置不允
我对 OpenJPA 的一个问题感到头疼。 我有一个方法: public void update() { System.out.println("START: Update...");
OpenJPA 是否支持类似于 Hibernate 的批量插入? ?我没有在文档中找到它,但我希望我错过了它。我知道JPA doesn't support it in general . 最佳答案 简
我在带有 DB2 的 WebSphere 上使用 OpenJPA 1.2.3。有没有一种方法可以构建和捆绑我的应用程序,允许同一应用程序 (EAR) 根据环境(DEV、ACPT、PROD 等)更改架构
OpenJPA 2.3.x 的删除顺序发生错误,我不知道为什么。 鉴于这些 JPA 映射 // grandparent @Entity @Table(name = "three_phase_motor
有没有办法按照它们的顺序获取列 在 Java 类中声明,还是以其他方式指定顺序? 我正在使用映射工具 ant 任务在 sql 文件中为我的类生成 DDL。 最佳答案 不,JPA 的每个实现都可以按照它
我正在使用 TomEE 1.5.2 服务器,我想知道在哪里可以找到 openejb.xml文件? 我必须配置这个文件,就像那里: http://tomee.apache.org/openjpa.htm
我是 OpenJPA 新手我正在尝试将数据插入到一个表中,其中一些数据来自另一个表。下面是场景。 Table1: id, app_name, app_version, app_active Tabl
嗨,我需要使用 and or 条件进行复杂的查询。但 and 条件似乎覆盖了 or 条件,这是我的代码: public List search(CartesioPojo params) { C
我想知道我使用 OpenJpa 2 保存实体的方式是否正确。 我从反序列化的休息服务接收对象,然后保存此实例: 开始交易 从数据库检索实例(即使我已经获得了该实例) 将属性从分离的实例复制到从数据库检
如何将 openjpa 设置为在查询前刷新。当我更改数据库中的某些值时,我想将这些更改传播到应用程序中。 我在 persistence.xml 中试过这个设置: false/true - same
是否可以将以下内容翻译成(Open)JPA? select t0.* from Person t0 left outer join Car t1 on t0.id = t1.id_person and
我正在尝试在现有的 Maven 项目中生成元模型。该项目已经有一些数据源,在生成源中生成了元模型。 我需要将新数据库中的表添加到此应用程序。我为 XML 配置生成了 Java 类和条目。下面的构建日志
我有以下查询方法,但性能较低: @Override public Map getFeatureCounts() { StopWatch timer = new StopWatch();
我是一名优秀的程序员,十分优秀!