Spring@Transactional&x27;不能使用其他注释吗?
所以我的春季教育还在继续。目前我正在尝试学习一些注释以及它们给Spring3带来的东西。所以我有一个迷你网络应用程序,可以连接到数据库,通过表单输入内容,显示记录等等。一切正常。我决定尝试让Spring自动检测我标记为@Transactional的服务bean,但这样做会阻止应用程序保存到DB。因此:Spring@Transactional&x27;不能使用其他注释吗?,spring,spring-mvc,spring-annotations,Spring,Spring Mvc,Spring Annotations,所以我的春季教育还在继续。目前我正在尝试学习一些注释以及它们给Spring3带来的东西。所以我有一个迷你网络应用程序,可以连接到数据库,通过表单输入内容,显示记录等等。一切正常。我决定尝试让Spring自动检测我标记为@Transactional的服务bean,但这样做会阻止应用程序保存到DB。因此: @Transactional public class ReservationServiceImpl implements ReservationService { 这很有效。我在springc
@Transactional
public class ReservationServiceImpl implements ReservationService {
这很有效。我在springcourt-data.xml文件中有一个此类的bean声明。没问题。但当我这样做时:
@Transacational
@Service("reservationService")
public class ReservationServiceImpl implements ReservationService {
它不再起作用了。我确实有
<context:component-scan base-package="com.springcourt" />
在springcourt-servlet.xml文件中。有人能告诉我我搞砸了什么吗?我所做的就是向这个类添加另一个注释,并从xml文件中删除bean定义,这样它就不再将数据保存到DB中。我仍然可以从数据库中查询记录和内容,尽管很明显它使用的是自动检测服务bean
以下是配置文件:
springcourt-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.springcourt" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="com.springcourt.web.ReservationBindingInitializer" />
</property>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
springcourt-servlet.xml
以及:
springcourt-data.xml
因为您可以通过同一个bean查询DB,所以您的@Transactional
可以正常工作,或者您经常会遇到异常(至少在Hibernate中是这样)。在保存操作中,很可能会出现导致事务回滚的运行时异常。试着找出什么是异常并从那里开始
更新 要查看是否应用了
@Transactional
,请从方法内部打印堆栈跟踪。如果您看到带有大量事务拦截器的长堆栈跟踪,则意味着事务方面可以工作 试试这个
- 将上下文组件扫描添加到spring-court-data.xml
<context:component-scan base-package="com.springcourt" />
<aop:aspectj-autoproxy/>
查询可能正在工作,因为您可能配置了OpenEntityManagerInViewInterceptor/筛选器。我也遇到了同样的问题并解决了它 首先,您必须将上下文:组件扫描与web和数据级别分开,如下所示:
<!--in springcourt-servlet.xml -->
<context:component-scan base-package="com.springcourt.web" />
<!--in springcourt-data.xml -->
<context:component-scan base-package="com.springcourt.dao" />
第二个添加到springcourt-data.xml
<context:component-scan base-package="com.springcourt" />
<aop:aspectj-autoproxy/>
我希望这会有所帮助除了您所拥有的功能外,您还可以使用以下功能:`
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class AppConfig {
(...)
}
您需要做的是在同一范围内注入所有内容。一种方法是更改ApplicationContext xml,如前所述,另一种方法是使用类似于CGLIB的Spring代理,以便获得基于子类的代理,并在其中编写bean实现和定义
进一步阅读:
@Transactional
,因为每个语句都可以在自己的事务中运行(取决于配置)。这同样适用于读和写。查看@Transactional
是否从方法内部应用了打印堆栈跟踪。如果您看到带有大量事务拦截器的长堆栈跟踪,则意味着事务方面可以工作。我很难想象数据没有被保存而没有任何错误。对不起,我并不奇怪我忘记了什么。我通过Hibernate连接到MySQL数据库使用JPA。我在上面添加了配置文件。另外,如果没有抛出任何内容,如何从stacktrace打印任何内容?我将仔细研究一下,看看我的猜测。要打印堆栈跟踪,只需将Thread.dumpStack()放在方法中。感谢提供的信息,我没有意识到这一点。也许我用错了地方,但我看不出这有什么价值。它只显示当前线程正在执行的方法,其中之一是将对象持久化到DB的方法。不过没有其他信息,只有方法调用。有几件事你为什么要在上下文中声明reservationService并在@Service中注释它,还要将上下文组件扫描添加到第二个上下文文件中,该文件在你的帖子中的“和”后面列出。你在“@Transactional”中有一个拼写错误。将其更正为“@Transactional”不,没有OpenEntityManagerViewInterceptor。至少我没有明确声明。然而,我尝试了你所说的,并且似乎奏效了。我在spring-court-data.xml文件中声明了服务包的组件扫描标记,并将另一个标记保留在spring-court-servlet.xml文件中。我猜这有点像普拉桑娜·塔拉坎蒂在上面说的。很明显,我不完全理解这些文件的分离对不同标签的影响。再多说一句。我从SpringCourt-*.xml文件中删除了所有配置,并将其放在applicationContext.xml中,重新使用,一切正常。因此,问题肯定与如何在两个文件之间划分有关。如果有人能给我一个清楚的解释