gpt4 book ai didi

jpa - 基于 Aspectj 编译时编织的事务不起作用(来自 WebService 调用的 JPA)

转载 作者:行者123 更新时间:2023-12-04 05:59:06 25 4
gpt4 key购买 nike

我正在尝试使用带有编译时编织的 aspectj 来支持诸如 Spring 的 @Transactional 和 @Configurable 之类的注释。我正在使用 org.springframework.orm.jpa.JpaTransactionManager 事务管理器,当我尝试在我的 GenericDAO 中调用 entityManager.persist(entity) 时,我在日志中看到的是这样的:

insurance-module-0.1-SNAPSHOT 19:57:55.199 [http-bio-8084-exec-49] TRACE org.hibernate.loader.Loader - Bound [6] parameters total
insurance-module-0.1-SNAPSHOT 19:57:55.199 [http-bio-8084-exec-49] TRACE org.hibernate.loader.Loader - processing result set
insurance-module-0.1-SNAPSHOT 19:57:55.199 [http-bio-8084-exec-49] DEBUG org.hibernate.loader.Loader - result set row: 0
insurance-module-0.1-SNAPSHOT 19:57:55.199 [http-bio-8084-exec-49] TRACE o.h.t.descriptor.sql.BasicExtractor - found [1] as column [id3_]
insurance-module-0.1-SNAPSHOT 19:57:55.199 [http-bio-8084-exec-49] DEBUG org.hibernate.loader.Loader - result row: EntityKey[com.vendio.insurance.domain.db.InsuranceRate#1]
insurance-module-0.1-SNAPSHOT 19:57:55.199 [http-bio-8084-exec-49] TRACE org.hibernate.loader.Loader - done processing result set (1 rows)
insurance-module-0.1-SNAPSHOT 19:57:55.200 [http-bio-8084-exec-49] TRACE org.hibernate.loader.Loader - total objects hydrated: 0
insurance-module-0.1-SNAPSHOT 19:57:55.200 [http-bio-8084-exec-49] DEBUG o.h.e.StatefulPersistenceContext - initializing non-lazy collections
insurance-module-0.1-SNAPSHOT 19:57:55.200 [http-bio-8084-exec-49] TRACE org.hibernate.impl.SessionImpl - after transaction completion
insurance-module-0.1-SNAPSHOT 19:57:55.201 [http-bio-8084-exec-49] TRACE o.s.t.s.TransactionSynchronizationManager - Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@5ec859c1] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@337cbe84] bound to thread [http-bio-8084-exec-49]
insurance-module-0.1-SNAPSHOT 19:57:55.209 [http-bio-8084-exec-49] DEBUG org.hibernate.SQL - select sequence_next_hi_value from hibernate_sequences where sequence_name = 'registered_policy' for update
insurance-module-0.1-SNAPSHOT 19:57:55.210 [http-bio-8084-exec-49] DEBUG org.hibernate.SQL - update hibernate_sequences set sequence_next_hi_value = ? where sequence_next_hi_value = ? and sequence_name = 'registered_policy'
insurance-module-0.1-SNAPSHOT 19:57:55.218 [http-bio-8084-exec-49] TRACE o.s.t.s.TransactionSynchronizationManager - Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@5ec859c1] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@337cbe84] bound to thread [http-bio-8084-exec-49]

所以每个表的休眠序列得到更新,但我的实体没有插入到数据库中。

如果我添加 entityManager.flush() 会出现一个异常,说明“没有正在进行的交易”。

这里发生了什么?!

我的 GenericDAO 类如下所示:
public class GenericDAO<T extends Persistable> { 
@PersistenceContext
protected EntityManager entityManager;

@PersistenceUnit
protected EntityManagerFactory entityManagerFactory;

@Transactional
public void saveOrUpdate(T entity) {
entityManager.persist(entity);
}

}

我从使用 WSSpringServlet 导出的 Web 服务调用 saveOrUpdate 方法。 .

P.S.:我的 Maven 配置也如下所示:
   <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<configuration>
<complianceLevel>1.6</complianceLevel>
<showWeaveInfo>true</showWeaveInfo>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>

编译时,我得到了一些看起来不错的东西(我的方面得到了应用):
    Join point 'method-call(void javax.persistence.EntityManager.persist(java.lang.Object))'
in Type 'com.vendio.insurance.dao.GenericDAO' (GenericDAO.java:28)
advised by afterThrowing advice from 'org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect'
(spring-aspects-3.1.0.RELEASE.jar!JpaExceptionTranslatorAspect.class:14(from JpaExceptionTranslatorAspect.aj))

我的相关 Spring 配置是:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<context:component-scan base-package="com.vendio.insurance" />
<context:spring-configured/>
<!-- <bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf">
<property name="transactionManager" ref="transactionManager"/>
</bean>-->

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />

所以一切看起来都不错,但我找不到为什么这不起作用的答案......

最佳答案

我在此链接后找到了答案:http://forum.springsource.org/showthread.php?18953-DispatcherServlet-and-ContextLoaderListener .

问题是由于我也在使用 Spring MVC 并且我在不知道两个几乎相同的 Spring 上下文的情况下创建。因此,事务由第一个上下文(接收 JAX-WS 调用的那个)中的事务管理器管理,但我正在调用的实体管理器由第二个上下文(使用不同的事务管理器)管理。

解决方案是隔离 DispatcherServlet 的小型简化上下文定义,并将其余 bean 留给 ContextLoaderListener 管理:

<listener> 
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/application-context.xml</param-value>
</context-param>

<servlet>
<servlet-name>spring-mvc-dispatcher-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>2</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/servlet-context.xml</param-value>
</init-param>
</servlet>

由于我使用了基于注释的 MVC(带有 @Controller 注释),因此我还必须缩小上下文的范围:“servlet”上下文中的组件扫描的基础包。

以下是拯救我一天的链接的引用:

DispatcherServlet will always load its own configuration file using -servlet.xml. It is intended that this file will contain web components such as Controllers, ViewResolvers and LocaleResolvers - but no middle tier components.

The ContextLoaderListener is then used to load the files containing your middle tier and data tier components. Spring will merge all these components into an ApplicationContext making your middle tier components accessible from your web tier components. >Rob Harrop Lead Engineer, dm Server

关于jpa - 基于 Aspectj 编译时编织的事务不起作用(来自 WebService 调用的 JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9133249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com