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