更新:在一次插入#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: 执行此操作需要事务处理(使用a 事务或扩展持久化上下文)
所以我的问题是两次
1)在整个过程中途,我的交易究竟发生了什么?可以避免吗?
2)是否有更好的方法来进行像这样的批量插入(请记住,我正在加载一堆Foo,并且需要在持久化之前将其转换为Bar。
我在jBoss 7.1.1.Final AS和hibernate-jpa-2.0-api中运行