0

更新:似乎在插入 #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 中运行

4

0 回答 0