0

我将我的应用程序的实体管理器工厂从弹簧管理切换到容器管理并且遇到了问题。在创建实体时,有时我必须在最初创建实体的同一事务中查询它,然后才能在最后自动刷新它。在春天,实体管理器会(我相信)在运行 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
}

如果我尝试在和方法entityManager.flush()之间添加调用,jboss 会抛出错误,无论我是否在运行测试的方法/类周围抛出 @Transactional 注释。persist()find()javax.persistence.TransactionRequiredException: no transaction is in progress

我的 persistence.xml 文件设置了<property name="org.hibernate.FlushMode" value="auto"/>,但它似乎不起作用。

是否有一些配置属性我错过了告诉 jboss 在运行 Find 之前将其上下文刷新到数据库?还是我错误地订购了我的陈述?

我已经将我的persistence.xmlmy-ds.xml文件放在了 pastebin 上。

谢谢您的帮助。

编辑

解决。请参阅下面的评论

4

1 回答 1

0

上传我的 spring-data.xml 后不久,我意识到我忘记了 bean。添加后,@Transactional 标记按预期工作,问题得到解决。

于 2012-11-07T23:23:25.637 回答