java.lang.IllegalStateException:没有可用的事务性EntityManager

java.lang.IllegalStateException:没有可用的事务性EntityManager,java,spring,hibernate,maven,jpa,Java,Spring,Hibernate,Maven,Jpa,项目使用Hibernate(JPA)、Spring和Maven。我的实体和DAO在一个单独的罐子中 pom.xml: ... 数据库 org.hibernate 休眠实体管理器 3.5.4-最终版本 道: 公共类AbstractDAO实现GenericDAO{ 私有最终类persistentClass; 私人实体管理者实体管理者; 公共抽象DAO(类entityClass){ 超级(); this.persistentClass=entityClass; } @持久上下文 公共无效设置Ent

项目使用Hibernate(JPA)、Spring和Maven。我的实体和DAO在一个单独的罐子中

pom.xml:


...
数据库
org.hibernate
休眠实体管理器
3.5.4-最终版本
道:

公共类AbstractDAO实现GenericDAO{
私有最终类persistentClass;
私人实体管理者实体管理者;
公共抽象DAO(类entityClass){
超级();
this.persistentClass=entityClass;
}
@持久上下文
公共无效设置EntityManager(EntityManager EntityManager){
this.entityManager=entityManager;
}
公共实体管理器getEntityManager(){
返回实体管理器;
}
...
公共图书馆{
//这一行的例外情况
Session Session=getEntityManager().unwrap(Session.class);
...
}
....
}

我有一个模块,它使用弹簧

pom.xml:


...
应用程序编程接口
org.springframework
弹簧芯
${spring.version}
org.springframework
spring上下文
${spring.version}
org.springframework
春季甲虫
${spring.version}
....
...    
AppContext.xml:

当我试图从EntityManager获取会话时,我发现以下异常:

java.lang.IllegalStateException: No transactional EntityManager available
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:223)
    at $Proxy121.unwrap(Unknown Source) 

您必须用@Transactional注释包围该方法:

@Transactional
公共图书馆{
//这一行的例外情况
Session Session=getEntityManager().unwrap(Session.class);
...
}
并在spring的xml配置文件中使用以下声明启用spring@Transactional处理(txManager是管理器的id)


试试这个

entityManager=entityManager.getEntityManagerFactory().createEntityManager();
Session session = (Session) entityManager.unwrap(Session.class);

所有这些对我都不起作用,我最终发现问题在于我使我的方法成为@Transactional,而我需要类成为@Transactional。在我的情况下,这是另一个问题(对于那些有@Transactional问题的人):


@事务代理才能工作,需要动态代理才能工作。它需要一个基于接口的代理(JDK代理,在这种情况下CGLIB不起作用)。因此,创建接口并通过服务实现它,@Transactional注释将起作用。

so。。您希望提供哪种类型的实体管理器?对不起,我详细描述了这个问题。什么意思?不幸的是,我不熟悉Hibernate。好的,谢谢你提供的补充信息。当你调用这个方法,得到异常时,你是否在一个事务中。。。我认为处理事务是在自动模式下进行的,因为我使用了
它说它是注释驱动的,所以您需要为需要进行事务处理的地方提供注释。我在你的代码中没有看到
@Transactional
注释。我已经添加了一段spring配置,我将该注释添加到了我的测试方法中,虽然我不明白为什么会这样,但它仍然有效。我得到这个异常是因为@Transactional旁边的session.beginTrasaction()是一个错误!这对我有用,它背后的魔力是什么?为什么
@PersistenceContext EntityManager EntityManager
不是
事务性的
,而是
EntityManager.getEntityManagerFactory().createEntityManager()是吗?我很快就能理解@PersistenceContext:用于应用程序服务器使用(如果未配置任何内容,则无事务控制)。如果您希望它是事务性的,您可以添加@transactional注释以使其成为spring-wrap。createEntityManager:用于spring的应用程序控制)spring将使entityManager具有事务性(注入)。@baybora.oren您的意思是
@transactional@PersistenceContext private entityManager
?那不是allowed@baybora.oren看看please@baybora我真正理解的是,这里的
entityManager
是显式创建的,实际上是应用程序管理的实体管理器。Spring这样的容器不负责维护由其创建的
EntityManager
的生命周期。但是您可以直接
@Autowire
EntityManagerFactory
,因为bean已经在
applicationContext
中配置好了。因此,这可以像下面的
emf.createEntityManager().unwrap(Session.class)”一样简单,以获得
Session`
entityManager=entityManager.getEntityManagerFactory().createEntityManager();
Session session = (Session) entityManager.unwrap(Session.class);