Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多次保存同一对象_Java_Jpa_Glassfish - Fatal编程技术网

Java 多次保存同一对象

Java 多次保存同一对象,java,jpa,glassfish,Java,Jpa,Glassfish,解决方案:设置Id=null,它将工作 这段代码在Tomcat7上非常有效,但在GlassFish4上只保存一次。该代码旨在多次合并对象的同一实例 <?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"

解决方案:设置Id=null,它将工作

这段代码在Tomcat7上非常有效,但在GlassFish4上只保存一次。该代码旨在多次合并对象的同一实例

<?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>

实体。Secao
实体功能
实体。Unidade
B.爱国主义
实体。描述
实体。Classificaco
自动的

public void save(){
int i=0;
EntityManager em=JpaUtil.getEntityManager();
而(i<10){
em.merge(项目);
i=i+1;
}
项目=新项目();
}
em.merge(项目)更新数据库中的项,或在不存在项时插入项。因此,如果没有更改,并且flush设置为auto,则只需要一次合并-因为
在合并之间不会更改

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


应用服务器中JPA的实现可能是多种多样的,所以您可能会在运行时观察到不同的查询。检查您的刷新策略和JTA设置。但是,一般来说,当从持久性上下文分离时,如果持久性项没有更改,则不需要合并。

您不清楚这段代码到底失败了哪一步。首先,是否调用了
salvar()
方法?如果没有,那么您需要在上下文中后退一步,并在SSCCE中显示应该调用该方法的JSF代码。如果它被正确调用,那么它根本不是JSF问题,您需要关注JPA部分。这是我的persistence.xml@BalusC是的,该方法被调用,但它只向数据库写入一次,而在Tomcat上它执行10次。好的,那么它不是JSF问题。您最好将JSF噪音从问题中去除,以获得JPA专家更好的关注。回到具体问题上来,具体的功能需求是什么?您使用的是什么JPA实现?为什么即使没有任何更改,您也要多次保留同一实体?我可以想象,如果实体不是“脏的”,出于性能原因,一些JPA实现可能不会持续。我不知道我当时遇到的问题。现在,很长一段时间以后,我可以用merge保存它,在保存之前只设置id=null。我改为persist,但它只会继续保存第一次。
public void save() {
    int i = 0;
    EntityManager em = JpaUtil.getEntityManager();

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