HibernateException: identifier of an instance of (class) was altered from (id1) to (id2)

1 resposta
marcellandrade

Olá pessoal. Estou fazendo uns testes de performance com o Hibernate utilizando o JunitPerf. Na hora mando simular uns 5 usuário fazendo insert ao mesmo tempo tenho o seguinte erro: [color=darkblue]org.hibernate.HibernateException: identifier of an instance of hibernate.entity.Page was altered from 55805 to 55809[/color].
Isso só acontece quando simulo mais de um usario chamando o metodo add ao mesmo tempo. Já dei uma pesquisada na net e vi que algo relacionado ao contexto do hibernate, ao estado do objeto, parece que depois de persistido o primeiro o hibernate considero os outro como sendo o mesmo objeto que já foi persistido no banco. Não manjo muito de hibernate :roll:

PageDAO
package hibernate.dao;

// Generated 04/09/2011 15:57:05 by Hibernate Tools 3.4.0.CR1

import hibernate.entity.Page;

import java.util.List;

import javax.naming.InitialContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Example;

/**
 * Home object for domain model class Page.
 * 
 * @see hibernate.entity.Page
 * @author Hibernate Tools
 */
public class PageDAO extends GenericDAO{

	private static final Log log = LogFactory.getLog(PageDAO.class);
	
	private Session session;
	
	
	public PageDAO(Session session){
        this.session  = session;
    }
	
	public PageDAO()
	{
		this.session = getSession();
	}

	public void add(Page transientInstance) {
		log.debug("persisting Page instance");
		Session s = getSession();
		try {
			s.persist(transientInstance);
			s.getTransaction().commit();
		} catch (HibernateException e) {
			s.getTransaction().rollback();
			e.printStackTrace();
		} finally {
			if(session != null && session.isOpen())
				s.close();
		}
	}

PageTest(Junit)

package hibernate.test;

import hibernate.dao.PageDAO;
import hibernate.entity.Page;
import junit.framework.TestCase;

import org.junit.Before;
import org.junit.Test;

public class PageTest extends TestCase  {

	private Page page;
	private PageDAO pageDao;

	@Before
	protected void setUp() {
		
		page = new Page();
		pageDao = new PageDAO();
		page.setPageTitle("Test937");
		byte[] s = new byte[3];
		page.setPageRestrictions(s);
	    page.setPageCounter(1 + (int)(Math.random() * 100));
		page.setPageIsRedirect((byte) 1);
		page.setPageIsNew((byte) 1);
		page.setPageRandom(12);
		byte[] f = new byte[2];
		page.setPageTouched(f);
		page.setRevisions(null);
		page.setPageLatest(1);
		page.setPageLen(3);	
		

	}

	public PageTest(String testName) {

		super(testName);

	}

	@Test
	public void testInsertPage() {

		
		long tempoInicial = System.currentTimeMillis();
		pageDao.add(page);
		long tempoFinal = System.currentTimeMillis();
		System.out
				.println(tempoFinal
						- tempoInicial
						+ "--------------------------------------------------------------------------------");
	}
}

loadPage(JunitPerf)

package hibernate.testperf;

import com.clarkware.junitperf.LoadTest;

import hibernate.test.PageTest;
import junit.framework.Test;
import junit.framework.TestCase;

public class loadPage{
	
	public static Test save(){
		
		int user = 5;
		int interacoes = 1;
		Test testCase = new PageTest("testInsertPage");
		Test loadTest = new LoadTest(testCase,user,interacoes);
		return loadTest;
	}

	 public static void main(String args[]) {
	        junit.textui.TestRunner.run(save());
	}
}

Page.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 04/09/2011 15:57:05 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="hibernate.entity.Page" table="page" catalog="wikidb">
        <id name="pageId" type="java.lang.Integer">
            <column name="page_id" />
            <generator class="native" />
        </id>
        <property name="pageNamespace" type="int">
            <column name="page_namespace" not-null="true" />
        </property>
        <property name="pageTitle" type="string">
            <column name="page_title" not-null="true" />
        </property>
        <property name="pageRestrictions" type="binary">
            <column name="page_restrictions" not-null="true" />
        </property>
        <property name="pageCounter" type="long">
            <column name="page_counter" not-null="true" />
        </property>
        <property name="pageIsRedirect" type="byte">
            <column name="page_is_redirect" not-null="true" />
        </property>
        <property name="pageIsNew" type="byte">
            <column name="page_is_new" not-null="true" />
        </property>
        <property name="pageRandom" type="double">
            <column name="page_random" precision="22" scale="0" not-null="true" />
        </property>
        <property name="pageTouched" type="binary">
            <column name="page_touched" not-null="true" />
        </property>
        <property name="pageLatest" type="int">
            <column name="page_latest" not-null="true" />
        </property>
        <property name="pageLen" type="int">
            <column name="page_len" not-null="true" />
        </property>
        <set name="revisions" table="revision" inverse="true" lazy="true" fetch="join">
            <key>
                <column name="rev_page" not-null="true" />
            </key>
            <one-to-many class="hibernate.entity.Revision" />
        </set>
    </class>
</hibernate-mapping>

1 Resposta

marcellandrade

Resolvido. Problema, por causa da concorrência, eu não poderia usar variaveis que estão fora dos métodos na classe PageTest. Só coloquei elas,page e pageDAO, dentro do método e funcionou.

Criado 10 de setembro de 2011
Ultima resposta 10 de set. de 2011
Respostas 1
Participantes 1