【问题标题】:Database not being updated after commit()commit() 后数据库未更新
【发布时间】:2014-12-02 09:10:09
【问题描述】:

我有一个方法可以在数据库中保留很多行,它是这样的:

private EntityManager em;

@PostConstruct
public void init() {
    Map props = new HashMap();
    props.put(PersistenceUnitProperties.JTA_DATASOURCE, dataSource());
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("db1", props);
    em = emf.createEntityManager();
}

public void persistAll(List list) {
    int count = 0;
    for (Object o : list) {

        if (count == 0) {
            em.getTransaction().begin();
        }
        em.persist(o);

        count++;
        if (count >= 500) {
            em.getTransaction().commit();
            count = 0;
        }
    }
    if (count > 0) {
        em.getTransaction().commit();
    }
}

这是我的 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="db1" transaction-type="JTA">
        <jta-data-source>db1</jta-data-source>
        <mapping-file>orm.xml</mapping-file>
        <class>com.entities.entity1</class>
        <class>com.entities.entity2</class>
        <class>com.entities.entity3</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <validation-mode>NONE</validation-mode>
        <properties>
            <property name="eclipselink.cache.size.default" value="0"/>
            <property name="eclipselink.cache.shared.default" value="false"/>
            <property name="eclipselink.logging.level" value="FINE"/>
        </properties>
    </persistence-unit>
</persistence>

事务在开始时打开并在持久化 500 个对象后提交,然后再次打开事务,以此类推。这个过程会一直重复,直到所有对象都被持久化。

问题是对象只有在整个列表被处理后才保存在数据库中,如果我中断执行,即使事务已经提交,它也不会保存任何东西。

有人知道我做错了什么吗?

【问题讨论】:

  • 应该可以。我已经测试了您的代码,并在每次提交后查看了数据库中的记录......
  • 这就是日志的用途,不是吗?
  • @AlanHay 我刚刚用 persistence.xml 代码和 entityManager 初始化更新了帖子。

标签: java jpa eclipselink entitymanager


【解决方案1】:

而不是提交,调用flush();做类似的事情

// open the transaction
// start the loop
// for each 500 call entityManager.flush();
// when the loop finishes, call commit() and finish the entityManagfer

【讨论】:

  • 为什么投反对票?有时人们没有勇气说出为什么答案不好...... -_-''
  • 感谢您的回答!我明天测试一下。
  • Commit 将写入所有未刷新的更改,因此显式调用 flush() 不会产生任何影响:docs.oracle.com/javaee/6/api/javax/persistence/…
  • 请注意,他只打开了一个并多次调用commit。
  • @uaiHebert 实际上我每次提交时都会再次调用 begin()。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 2015-12-25
  • 1970-01-01
  • 2020-04-03
  • 2011-08-02
相关资源
最近更新 更多