JPA 中的二个问题,请教下 EntityManager 为什么为空。我用的是JDK,Tomcat6 Spring JPA
1. 在DAO 中注入
@PersistenceContext(unitName = "jpaDemo")
private EntityManager em;
我在用 save() 时,em 的值为空。为什么没有注册进来。 EntityManager em;
@Override
@Transactional(readOnly = false)
public void save(User role) {
em.persist(role);
}
DAO 中的代码:
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import org.springframework.orm.jpa.support.JpaDaoSupport;
import org.springframework.transaction.annotation.Transactional;
import com.east.jpa.demo.dao.IDAO;
import com.east.jpa.demo.entity.Role;
import com.east.jpa.demo.entity.User;
public class UserDAO extends JpaDaoSupport implements IDAO {
@PersistenceContext(unitName = "jpaDemo")
private EntityManager em;
@Override
@Transactional(readOnly = false)
public void save(User role) {
em.persist(role);
}
}
-----applicationContext.xml-------------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
xmlns:tx="http://www.springframework.org/schema/tx">
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="jpaDemo" />
</bean>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- UserDAO -->
<bean id="userDao" class="com.east.jpa.demo.dao.impl.UserDAO">
<property name="entityManagerFactory"
ref="entityManagerFactory">
</property>
</bean>
</beans>
-------------------------------------------------------------------------
----------------------------persistence.xml----------------------------
<?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_1_0.xsd"
version="1.0">
<persistence-unit name="jpaDemo" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.east.jpa.demo.entity.User</class>
<class>com.east.jpa.demo.entity.Role</class>
<properties>
<property name="hibernate.dialect"
value="org.hibernate.dialect.Oracle9Dialect" />
<property name="hibernate.connection.driver_class"
value="oracle.jdbc.OracleDriver" />
<property name="hibernate.connection.username" value="East" />
<property name="hibernate.connection.password" value="East" />
<property name="hibernate.connection.url"
value="jdbc:oracle:thin:@127.0.0.1:1521:East" />
<property name="hibernate.max_fetch_depth" value="1" />
<!--
<property name="hibernate.hbm2ddl.auto" value="create" />
-->
<!-- 调整JDBC抓取数量的大小: Statement.setFetchSize() -->
<property name="hibernate.jdbc.fetch_size" value="18" />
<!-- 调整JDBC批量更新数量 -->
<property name="hibernate.jdbc.batch_size" value="10" />
<!-- 显示最终执行的SQL -->
<property name="hibernate.show_sql" value="true" />
<!-- 格式化显示的SQL -->
<property name="hibernate.format_sql" value="true" />
<!-- 配置JTA 事务信息 -->
<property name="hibernate.transaction.factory_class"
value="org.hibernate.transaction.JTATransactionFactory" />
我使用这个,就在Tomcat 启动时出错:
Caused by: org.hibernate.TransactionException: Could not find UserTransaction in JNDI:
at org.hibernate.transaction.JTATransaction.<init>(JTATransaction.java:64)
at org.hibernate.transaction.JTATransactionFactory.createTransaction(JTATransactionFactory.java:57)
at org.hibernate.jdbc.JDBCContext.getTransaction(JDBCContext.java:193)
at org.hibernate.impl.SessionImpl.getTransaction(SessionImpl.java:1315)
at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:453)
... 47 more
Caused by: javax.naming.NamingException: Cannot create resource instance
<property
name="hibernate.transaction.flush_before_completion" value="true" />
<property name="hibernate.transaction.auto_close_session"
value="true" />
</properties>
</persistence-unit>
</persistence>
-----------------------------------------------------------------------------------
--后面我使用了一个类,但是这个类加上去启动没有出错,------org.hibernate.transaction.JDBCTransactionFactory-------
但是在
@Override
@Transactional(readOnly = false) 这个去了,不会有错,但是没有将数据保存到数据库
public void save(User role) {
em.persist(role);
}
2. 方法中带上@Transactional(readOnly = false)这个,用 org.hibernate.transaction.JDBCTransactionFactory
出错。
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
Caused by: java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
at org.hibernate.ejb.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:317)
at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:70)
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:326)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:350)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:262)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy14.save(Unknown Source)
问题1. 为什么em 为空
2。 怎么配置 persistence.xml 与applicationContext.xml文件,使的程序中能用JTA事务。