解决方案:设置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();
}
答案 0 :(得分:1)
em.merge(item);
更新数据库中的项目,或者在不存在时插入项目。因此,如果没有更改,并且flush设置为auto,则只需要一个合并 - 因为item
在合并之间不会更改。
如果您想多次存储此item
,则必须em.persist(item)
。如果@id
列未设置为generate
,则可能需要更新pk属性 - 否则您将拥有ConstraintViolationException
。
在应用程序服务器中实现JPA可能是多种多样的,因此您可能会在运行时观察到不同的查询。检查您的刷新政策和JTA设置。但是,一般情况下,当从持久化上下文中分离时,持久化项目不会更改时,不需要合并。