【问题标题】:No transactional entitymanager available in @PostConstruct@PostConstruct 中没有可用的事务实体管理器
【发布时间】:2015-02-18 15:51:17
【问题描述】:

问题: entityManager.unwrap(SessionImplementor.class) 导致 no transactional entitymanager available 异常。

代码:

@Component
public class HibernateEventWiring {

    @Autowired
    private ViewListener listener;

    @PersistenceContext(unitName = "config-punit")
    private EntityManager entityManager;

    @PostConstruct
    public void registerListeners() {
        SessionFactory sessionFactory = getSessionFactory();
        EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory).getServiceRegistry().getService(
                EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener(listener);
    }

    @Transactional
    private SessionFactory getSessionFactory() {
        // EXCEPTION: No transactional entitymanager available
        return entityManager.unwrap(SessionImplementor.class).getFactory(); 
    }
}

【问题讨论】:

  • stackoverflow.com/q/14522691/1391249, stackoverflow.com/q/3423972/1391249 此外,您不应无意中导入 javax.transaction.Transactional (Java EE 7) 来代替 org.springframework.transaction.annotation.Transactional
  • 我假设您使用的是 org.springframework.transaction.annotation.Transactional 而不是 javax.transaction.Transactional 注释。这是真的吗?

标签: java spring hibernate


【解决方案1】:

根据this excelent answer

在@PostConstruct 中(与 InitializingBean 接口中的 afterPropertiesSet 一样)无法确保所有后处理都已完成,因此(确实)不可能有事务。

如我所见,您不需要事务或实体管理器 bean,而是需要一个实体管理器工厂 bean。我认为您应该简单地自动装配 EntityManagerFactory,然后从中解开 Hibernate SessionFactory。

@Autowired
private EntityManagerFactory entityManagerFactory;

@PostConstruct
public void registerListeners() {
    SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
    ...
}

【讨论】:

  • EntityManagerFactory 没有unwrap 方法。请更新您对((HibernateEntityManagerFactory) entityManagerFactory).getSessionFactory()的回答
  • 自 JPA 2.1 版以来,EntityManagerFactory 类上有 unwrap 方法。 (javaee 7 javadoc)
  • 我通过使用 entityManager.getEntityManagerFactory().unwrap(SessionFactory.class)(受此 answer 启发)结束了对您答案的轻微变化,因为 entityManager 已经被 Spring 注入到课程中。
猜你喜欢
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
相关资源
最近更新 更多