我将应用程序的实体管理器工厂从spring管理切换到容器管理,结果遇到了问题。在创建实体时,有时我必须在最初创建它的同一事务中查询它,然后才能在结束时自动刷新它。在spring中,实体管理器将(我相信)在运行find之前自动刷新上下文,并能够返回正确的对象,但在jboss中,find方法返回null。
下面是这个问题的一个示例:
@PersistenceContext
private EntityManager entityManager;
private void test(){
Person person = new Person("firstname", "lastname", "email", "user", "pass", Person.PersonType.admin);
entityManager.persist(person);
assert person.getId() != null;
Person person2 = entityManager.find(Person.class, person.getId());
assert person2 != null; //fail in jboss, ok in Spring
}如果我试图在persist()和find()方法之间添加一个entityManager.flush()调用,jboss就会抛出一个javax.persistence.TransactionRequiredException: no transaction is in progress错误,而不管我是否在运行测试的方法/类周围抛出了@Transactional注释。
我的persistence.xml文件设置了<property name="org.hibernate.FlushMode" value="auto"/>,但它似乎不起作用。
我是否遗漏了一些配置属性来告诉jboss在运行Find之前将其上下文刷新到数据库?或者我的语句排序不正确?
我已经把我的persistence.xml和my-ds.xml文件放在粘贴箱里了。
谢谢你的帮助。
编辑
已解决。请参阅下面的评论
发布于 2012-11-08 07:23:26
在上传我的spring-data.xml之后不久,我意识到我忘记了bean。添加之后,@Transactional标记按预期工作,问题就解决了。
https://stackoverflow.com/questions/11238662
复制相似问题