我收到与以下链接中提到的完全相同的问题:
Upgraded from Spring 4.1.6 to 4.2.4 and suddenly getting TransactionRequiredException
对我来说,目标在SharedEntityManagerCreator.java中为null。
我有类似的配置设置和@transactional注释。我看了上面链接中给出的春季门票。
在我的情况下在TransactionSynchronizationManager中(如下所示的行)。对resources.get()的调用返回一个空映射。
private static Object doGetResource(Object actualKey) {
Map<Object, Object> map = resources.get();
if (map == null) {
return null;
}
}
下面是我的hibernate xml配置:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.mycomp"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="persistenceProvider">
<bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
</property>
<property name="jpaProperties">
<props>
<prop key="persistenceUnitName">xxxxPersistenceUnitName</prop>
<prop key="hibernate.dialect">xxxxPostgreSQLDialectWithHStore</prop>
<prop key="hibernate.default_schema">phoenix</prop>
<prop key="hibernate.enable_lazy_load_no_trans">true</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.id.new_generator_mappings">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
添加更多信息
高层结构
WebService Endpoint
Services Components
Persistent Service
我的持久服务类`public interface xxxService {
@Transactional
public <T> T update(T entity);
}
@Componen public class xxxxServiceImpl实现了xxxService {
@PersistenceContext(unitName = "xxxx")
private EntityManager entityManager;
@Override
public <T> T update(T entity) {
return entityManager.merge(entity);
}
}`
我试图将@Transactional注释放在类级别但是给了我同样的错误。 此外,当我调试Spring时,不会为My persistence类创建代理,因为事务注释在该类上。而是在EntityManager上创建它。 (我不确定为什么会出现这种情况,但这就是我观察到的情况。)
我的技术堆栈如果有用:
我确实看到以下登录日志文件:
SVCS 2017-06-29 12:34:06,942 [http-nio-8080-exec-2] INFO oscsPostProcessorRegistrationDelegate $ BeanPostProcessorChecker - 类型为[com.xxxxx.database.xxxxxService]的Bean'scopedTarget.xxxxService'不是有资格获得所有BeanPostProcessors处理(例如:不符合自动代理条件)
不确定它们是否相关但是它显示了具有entityManager定义的服务(不符合自动代理条件),不确定这是否是导致问题的原因。