多次保存同一个对象

时间:2014-01-29 03:05:45

标签: java jpa glassfish

解决方案:设置ID = null,它会起作用。

此代码在Tomcat 7上运行完美,但在Glassfish 4上只能保存一次。该代码旨在多次合并对象的同一实例。

<?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="default" transaction-type="RESOURCE_LOCAL">
    <class>entities.Secao</class>
    <class>entities.Funcionario</class>
    <class>entities.Unidade</class>
    <class>entities.Patrimonio</class>
    <class>entities.Descricao</class>
    <class>entities.Classificacao</class>

    <validation-mode>AUTO</validation-mode>
    <properties>
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/patrimonio" />
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="root" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />

    </properties>
</persistence-unit>

public void save() {
    int i = 0;
    EntityManager em = JpaUtil.getEntityManager();

    while (i < 10) {
        em.merge(item);         
        i = i + 1;          
    }
    item = new Item();      
}

1 个答案:

答案 0 :(得分:1)

em.merge(item);更新数据库中的项目,或者在不存在时插入项目。因此,如果没有更改,并且flush设置为auto,则只需要一个合并 - 因为item在合并之间不会更改。

如果您想多次存储此item,则必须em.persist(item)。如果@id列未设置为generate,则可能需要更新pk属性 - 否则您将拥有ConstraintViolationException

在应用程序服务器中实现JPA可能是多种多样的,因此您可能会在运行时观察到不同的查询。检查您的刷新政策和JTA设置。但是,一般情况下,当从持久化上下文中分离时,持久化项目不会更改时,不需要合并。