2014-01-29 2 views
0

Этот код отлично работает на 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

Вы не знаете, на каком этапе этот фрагмент кода не работает. Для начала используется метод 'salvar()' или нет? Если нет, то вам нужно сделать шаг назад в контексте и показать в SSCCE вкус кода JSF, который должен вызывать этот метод. Если он, однако, правильно вызывается, то это не проблема JSF, и вам нужно сосредоточиться на части JPA. – BalusC

+0

это мой persistence.xml https://github.com/erickdeoliveiraleal/sispatri/blob/master/src/META-INF/persistence.xml – erickdeoliveiraleal

+0

@BalusC Да, метод вызывается, но он только записывает один раз в базы данных, а на Tomcat - 10. – erickdeoliveiraleal

ответ

1

em.merge(item); обновление элемент в базе данных, или вставляет элемент, когда не существует. Поэтому, если изменений нет, и для флеша установлено значение auto, требуется только одно слияние - потому что item не изменяется между слияниями.

Если вы хотите сохранить это item несколько раз, вам нужно em.persist(item). Если столбец @id не установлен в generate, возможно, вам придется обновить атрибут pk - в противном случае у вас будет ConstraintViolationException.

Внедрение JPA в серверах приложений может быть различным, поэтому вы можете наблюдать разные запросы во время выполнения. Проверьте политику очистки и настройки JTA. Но, вообще говоря, никакого слияния не требуется, когда сохраняемый элемент не изменяется при отключении от контекста персистентности.

+0

Я изменился, чтобы сохранить его, но он сохраняет только первый раз. – erickdeoliveiraleal

Смежные вопросы