送分啦!可以从其余的途径获取原来由@PersistenceContext注解得到的EntityManager吗!
送分啦!!!可以从其他的途径获取原来由@PersistenceContext注解得到的EntityManager吗!!!
通过以下的注解和spring配置文件就可以实现事务的管理了,验证起来是这样的,查了很多资料 发现通过@PersistenceContext注解得到的EntityManager 是由PersistenceAnnotationBeanPostProcessor调用SharedEntityManagerCreator.createSharedEntityManager(
emf, this.properties, this.synchronizedWithTransaction, getResourceType()) ,再由代理创建的,如果想通过注入的方式放到SimpleJpaRepository里 而不是现在显示的调用构造函数的话 可以做到吗
想po脑袋还是觉得不行啊 首先我不会在配置文件里给SimpleJpaRepository的构造函数的参数把容器管理的EntityManager翻进去,不知道怎么获取,如果不获取容器里的 而是自己创建EntityManager 那还有意义吗 就得自己管理了吧
各位走过 路过 不要错过啊,欢迎拍砖 欢迎分享
------解决思路----------------------
不用构造,利用EntityManagerFactory.createEntityManager();你的EntityManagerFactory已经交给spring管理了,只要利用spring的applicationContext.getBean("entityManagerFactory")就可以获得EntityManagerFactory实例
------解决思路----------------------
楼主的代码问题太多你的JpaDao是不是已经在spring容器里面跑了,如果是楼主在JpaDao里面又用new ClassPathXmlApplicationContext("meta-inf/beans.xml");等于又启用了一个spring容器,问题大大的。还有你的SimpleJpaRepository simpleJpaRepository干嘛要一直new啊
------解决思路----------------------
你的JpaDao已经是dao层了干嘛还要用SimpleJpaRepository,直接用entityManager操作就行了,simpleJpaRepository应该是给你的JpaDao继承用的应该是JapDao<T> extends SimpleJpaRepository<T>,直接用spring的@PersistenceContext注入entityManager就行了,没必要整那么多
通过以下的注解和spring配置文件就可以实现事务的管理了,验证起来是这样的,查了很多资料 发现通过@PersistenceContext注解得到的EntityManager 是由PersistenceAnnotationBeanPostProcessor调用SharedEntityManagerCreator.createSharedEntityManager(
emf, this.properties, this.synchronizedWithTransaction, getResourceType()) ,再由代理创建的,如果想通过注入的方式放到SimpleJpaRepository里 而不是现在显示的调用构造函数的话 可以做到吗
想po脑袋还是觉得不行啊 首先我不会在配置文件里给SimpleJpaRepository的构造函数的参数把容器管理的EntityManager翻进去,不知道怎么获取,如果不获取容器里的 而是自己创建EntityManager 那还有意义吗 就得自己管理了吧
各位走过 路过 不要错过啊,欢迎拍砖 欢迎分享
public class JpaDaox<T>{
@PersistenceContext
private EntityManager entityManager;
private SimpleJpaRepository simpleJpaRepository;
public Object get(Class<?>T,Serializable id){
simpleJpaRepository=new SimpleJpaRepository(T,entityManager);
Object object= simpleJpaRepository.findOne(id);
return object;
}
@Transactional
public void save(T t) {
Class clazz=t.getClass();
simpleJpaRepository=new SimpleJpaRepository(clazz,entityManager);
simpleJpaRepository.save(t);
//throw new RuntimeException("dddd");
}}
<context:annotation-config />
<context:component-scan base-package="jpa_data" />
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="META-INF/persistence.xml" />
<property name="persistenceUnitName" value="SimplePU" />
</bean>
<bean id="jpaDao" class="spring.data.jpa.JpaDaox">
</bean>
------解决思路----------------------
不用构造,利用EntityManagerFactory.createEntityManager();你的EntityManagerFactory已经交给spring管理了,只要利用spring的applicationContext.getBean("entityManagerFactory")就可以获得EntityManagerFactory实例
------解决思路----------------------
楼主的代码问题太多你的JpaDao是不是已经在spring容器里面跑了,如果是楼主在JpaDao里面又用new ClassPathXmlApplicationContext("meta-inf/beans.xml");等于又启用了一个spring容器,问题大大的。还有你的SimpleJpaRepository simpleJpaRepository干嘛要一直new啊
------解决思路----------------------
你的JpaDao已经是dao层了干嘛还要用SimpleJpaRepository,直接用entityManager操作就行了,simpleJpaRepository应该是给你的JpaDao继承用的应该是JapDao<T> extends SimpleJpaRepository<T>,直接用spring的@PersistenceContext注入entityManager就行了,没必要整那么多