【发布时间】:2023-03-15 18:48:01
【问题描述】:
我正在构建一个 Maven 测试项目,该项目运行: 春季MVC 3.1.1 JPA,以 Hibernate 4.1.4 作为 jpa 提供者 MYSQL 5.5.x 汤姆猫 7
我正在尝试创建一个简单的端到端基本用例,其中涉及从数据库读取和更新。 因为我喜欢坚持使用纯 JPA,所以我使用 spring 的 LocalContainerEntityManagerFactoryBean,使用 @PersistenceContext 注释注入我的 dao。
此时我遇到的问题:
- 我无法坚持到 DB(没有抛出异常,但也没有 db 反射)。
- 我无法删除表单 DB(没有抛出异常,但也没有 db 反射)。
我可以从数据库中读取数据。
查看文档后,我发现我可能缺少一些 JPA 支持,因为 TOMCAT 不包含开箱即用的功能。
我浏览了 this 和 this 和 that(以及更多......)并应用了以下内容:
- 在我的 pom.xml 中添加了 spring-instrument-tomcat 依赖项(只是为了检索 jar)。
- 我将那个 jar 复制到了我的 tomcat 的 lib 目录中
-
在 META-INF 目录下,我创建了一个 context.xml 文件,内容如下:
<Context docBase="SpringTest" path="/SpringTest" reloadable="true" source="org.eclipse.jst.jee.server:SpringTest"> <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" useSystemClassLoaderAsParent="false" /> </Context> 我将 InstrumentationLoadTimeWeaver 添加到我的实体管理器定义中
这应该可以解决问题 - 但事实并非如此。我遇到了同样的行为。
然后我遇到了来自stackoverflow的this问题。建议添加事务定义的答案之一:<tx:annotation-driven proxy-target-class="true" /> 到 DispatcherServlet 上下文(到目前为止,我只在我的根应用程序上下文中使用它)。做完这些事情开始解决之后,事务被提交到数据库。
此时我开始怀疑是否仍然需要所有其余的东西,所以我回滚了除了添加到 DispatcherServlet 之外的所有内容,它仍然可以正常工作!
所以,我的问题:它是如何工作的?我真的需要所有这些来支持tomcat中的JPA吗?最后,为什么我需要将声明复制到 DispatcherServlet 才能解决这个问题?
提前致谢, 修行者
【问题讨论】:
-
我有同样的问题,我不知道。好问题,知道会很有趣。
-
我想总结一下,Tomcat 不会自动为您处理事务。没有容器应该。您需要一个事务来进行任何数据库更改。记录器中的某处可能显示了错误或消息,但您的级别没有公开它们。不,您不需要添加的乐器内容。在我看来,带注释的事务支持是在任何现代 Spring 3.x 应用程序中实现事务处理的最佳方式。我不太确定为什么声明在根上下文中不起作用。假设它应该在那里工作。
标签: hibernate spring-mvc jpa-2.0 maven-3 tomcat7