Java 春季三,;JPA使用JTATransactionManager,但事务管理器无法提交
我使用Spring并与Hibernate4集成作为持久性提供者,这里我尝试的是执行crud操作 关于学生主体 我的所有选择操作都正常工作,但添加和更新操作不工作 我的persistence.xmlJava 春季三,;JPA使用JTATransactionManager,但事务管理器无法提交,java,spring,jakarta-ee,java-ee-6,jta,Java,Spring,Jakarta Ee,Java Ee 6,Jta,我使用Spring并与Hibernate4集成作为持久性提供者,这里我尝试的是执行crud操作 关于学生主体 我的所有选择操作都正常工作,但添加和更新操作不工作 我的persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="forSpring" transaction-type="JTA">
<class>com.entity.Student</class>
</persistence-unit>
</persistence>
com.entity.Student
我的Spring-bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
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/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="com.*" />
<jee:jndi-lookup id="datasourceId" jndi-name="jdbc/myPrac" resource-ref="true" />
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<!-- Spring integration with JPA -->
<bean id="vendorAdaptor-inj" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="DERBY" />
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
</bean>
<bean id="entityMgrFactory-inj" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="datasourceId" />
<property name="persistenceUnitName" value="forSpring" />
<property name="jpaVendorAdapter" ref="vendorAdaptor-inj" />
</bean>
</beans>
这是我的学生刀
package com.dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.entity.Student;
@Repository("studentSpringDao-inj")
@Transactional(value="txManager",readOnly=true)
public class StudentSpringDAO {
@PersistenceContext(unitName="forSpring")
private EntityManager em;
public EntityManager getEm() {
return em;
}
public void setEm(EntityManager em) {
this.em = em;
}
public List<Student> getStudentList() throws Exception{
System.out.println(" \n\n\n LOADING... \n\n\n ");
String query = "select s from Student s order by s.studentId desc";
TypedQuery<Student> studentQuery = em.createQuery(query,Student.class);
return studentQuery.getResultList();
}
public Integer latestStudent() throws Exception{
String query = "select max(s.studentId) from Student s";
TypedQuery<Integer> studentQuery = em.createQuery(query,Integer.class);
return studentQuery.getResultList().get(0);
}
@Transactional(value="txManager",readOnly=false,propagation=Propagation.REQUIRES_NEW)
public Student saveStudent(Student student) throws Exception{
return em.merge(student);
}
}
package com.dao;
导入java.util.List;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
导入javax.persistence.TypedQuery;
导入org.springframework.stereotype.Repository;
导入org.springframework.transaction.annotation.Propagation;
导入org.springframework.transaction.annotation.Transactional;
导入com.entity.Student;
@知识库(“studentSpringDao inj”)
@事务性(value=“txManager”,readOnly=true)
公立班学生{
@PersistenceContext(unitName=“forSpring”)
私人实体管理者;
公共实体管理器getEm(){
返回em;
}
公共无效setEm(实体管理器em){
this.em=em;
}
公共列表getStudentList()引发异常{
System.out.println(“\n\n\n正在加载…\n\n\n”);
String query=“根据s.studentId desc从学生订单中选择s”;
TypedQuery studentQuery=em.createQuery(查询,Student.class);
return studentQuery.getResultList();
}
公共整数latestStudent()引发异常{
String query=“从学生s中选择max(s.studentId)”;
TypedQuery studentQuery=em.createQuery(查询,Integer.class);
return studentQuery.getResultList().get(0);
}
@事务性(value=“txManager”,readOnly=false,传播=propagation.REQUIRES\u NEW)
公共学生保存学生(学生学生)引发异常{
返回em.merge(学生);
}
}
仅供参考,我使用jndi查找名称“jdbc/myPrac”查找数据源
您能帮我解决这个问题吗?我是否缺少spring-bean.xml中的任何配置
@Transactional(value="txManager",readOnly=true)
你认为readOnly=true
是什么意思?你用readOnly=false
试过吗
你认为
readOnly=true
是什么意思?你用readOnly=false
试过吗?替换类org.springframework.transaction.jta.JtaTransactionManager
使用
org.springframework.orm.jpa.JpaTransactionManager
并添加tx:annotation-driven
替换类org.springframework.transaction.jta.JtaTransactionManager
使用
org.springframework.orm.jpa.JpaTransactionManager
和addtx:annotation-driven
确定,问题是即使StudentDAO中的EntityManager实例为空,您能告诉我应该有什么问题吗?您说您的选择工作正常。如果你的EntityManager为null,它们怎么能正常工作呢?当我在spring-bean.xml中输入时,我的EntityManager不为null,获取学生可以工作,但无法执行合并操作,插入查询没有被激发,我在@Transational中执行了readOnly=false,而合并操作没有工作,问题是我的EntityManager实例在StudentDAO中为空,你能告诉我应该是什么问题吗?你说你的选择很好。如果您的EntityManager为null,它们怎么能正常工作?当我在spring-bean.xml中输入时,我的EntityManager不为null,获取学生可以工作,但无法执行合并操作,插入查询没有被激发,我在@Transational中执行了readOnly=false,而合并操作也不起作用