更新:似乎在插入 #412 后,它在数据库级别的非空约束失败了。事务可能正在回滚。鉴于此设置,是否有可能建立新的交易?
我正在尝试在我的 oracle 数据库中插入很多行,并且 JPA 工作得很好,直到大约第 400 次插入。我希望有几千行要插入。
这是我的伪代码(为清楚起见而缩短)和 persistence.xml:
@Stateless
public class LocalContentService
{
@Inject EntityManager em;
public void mySavingMethod(){
for(Foo foo : fooDao.fetchAllFoos()){
Bar bar = new Bar(foo);
em.persist(bar);
em.flush();
em.clear();
log.debug("Saved content for: " + bar.getId());
}
}
<persistence-unit name="databaseTest" >
<jta-data-source>java:/jdbc/testDS</jta-data-source>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<class>org.myorg.Bar</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.use_sql_comments" value="true" />
</properties>
</persistence-unit>
大约 400 行后,我收到此错误消息,并且所有后续插入都失败:
错误 [stderr] (http--127.0.0.1-8080-1) javax.persistence.TransactionRequiredException: JBAS011469: 执行此操作需要事务(使用事务或扩展持久性上下文)
所以我的问题是双重的
1) 在这个过程中,我的交易到底发生了什么?可以避免吗?
2)有没有更好的方法来进行像这样的批量插入(请记住,我正在加载一堆 Foo,它们需要在持久化之前转换为 Bar。
我在 jBoss 7.1.1.Final AS 和 hibernate-jpa-2.0-api 中运行