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