Hibernate - Tentando usar many-to-one com 2 Session

Olá
Estou apanhando feio aqui para conseguir usar o relacionamento many-to-one e 2 Sessões diferentes, ou seja, na primeira sessão eu carrego um objeto e na outra sessão eu tento salvar o objeto que irá possuir o relacionamento. Montei um exemplo bem simples para ficar mais claro o que eu quero. Let´s GO:
Possuo 2 Tabelas no Banco de Dados e 2 Bean.
são eles
Cidades

public class Cidades implements Serializable {
  private Integer codigo; //ID no Banco
  private String nome;
   //métodos gets e sets...
}

Clientes

public class Clientes implements Serializable {
  private Integer codigo; //ID do Clientes
  private String nome; 
  private Cidades cidades; //Meu Objeto Cidades
  //getters e setters
}

Tanto o ID do Cidades como do Clientes serão preenchidos manualmente.
O Relacionamento está na tabela de Clientes, onde eu possuo a tag <many-to-one assim

        &lt;many-to-one
            name=&quot;cidades&quot;
            class=&quot;br.com.junior.models.Cidades&quot;
            cascade=&quot;all&quot;
            outer-join=&quot;auto&quot;
            column=&quot;cidade&quot;
        /&gt;

Supondo que eu já possuo registros cadastrados na tabela de Cidades (no meu projeto real eu irei ter), eu criei uma classe Principal para carregar o Objeto Cidades do Banco de Dados (primeira session), atribuir esse Objeto cidades ao objeto Clientes e depois salvá-lo (segunda Session).
Segue a classe

	public static void main&#40;String args&#91;&#93;&#41; throws HibernateException &#123;
		Configuration configuration = new Configuration&#40;&#41;;
		configuration.addClass&#40;Cidades.class&#41;;
		configuration.addClass&#40;Clientes.class&#41;;
		SessionFactory factory = configuration.buildSessionFactory&#40;&#41;;
		/*Primeira sessão*/
		Session session = factory.openSession&#40;&#41;;
		Transaction tx = session.beginTransaction&#40;&#41;;
		Cidades cidades = &#40;Cidades&#41; session.load&#40;Cidades.class,Integer.valueOf&#40;&quot;2&quot;&#41;&#41;;
		session.flush&#40;&#41;;
		tx.commit&#40;&#41;;
		session.close&#40;&#41;;
		/*Preencher Dados*/
		Clientes clientes = new Clientes&#40;&#41;;
		clientes.setCodigo&#40;Integer.valueOf&#40;&quot;1&quot;&#41;&#41;;
		clientes.setNome&#40;&quot;Junior&quot;&#41;;
		clientes.setCidades&#40;cidades&#41;;
		/*Segunda Sessão
		 */
		Session session2 = factory.openSession&#40;&#41;;
		Transaction tx2 = session2.beginTransaction&#40;&#41;;
		session2.save&#40;clientes&#41;;
		session2.flush&#40;&#41;;
		tx2.commit&#40;&#41;;
		session2.close&#40;&#41;;
	&#125;

Com certeza absoluta o objeto Cidades está com dados preenchidos.
Quando eu tento gravar, da o seguinte erro (inclusive com a propriedade hibernate.show_sql = true).

[quote]Hibernate: select cidades0_.codigo as codigo0_, cidades0_.nome as nome0_ from cidades cidades0_ where cidades0_.codigo=?
Hibernate: insert into cidades (nome, codigo) values (?, ?)
12/08/2004 11:30:54 net.sf.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 1062, SQLState: S1009
12/08/2004 11:30:54 net.sf.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Invalid argument value, message from server: “Duplicate entry ‘2’ for key 1”
12/08/2004 11:30:54 net.sf.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 1062, SQLState: S1009
12/08/2004 11:30:54 net.sf.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Invalid argument value, message from server: “Duplicate entry ‘2’ for key 1”
12/08/2004 11:30:54 net.sf.hibernate.JDBCException
SEVERE: Could not execute JDBC batch update
java.sql.BatchUpdateException: Invalid argument value, message from server: “Duplicate entry ‘2’ for key 1”
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1394)[/quote]

Note-se que primeiro ele faz um Select para preencher o objeto Cidades (primeira session) e na hora de salvar o objeto (Clientes) ele tenta primeiro salvar novamente o objeto (cidades) assim gerando uma exception de ID duplicate.

Se eu fizer tudo em uma única Session funciona normal. Mas eu estou tentando fazer assim, pois no meu projeto real, eu primeiro irei carregar o Objeto cidades, depois carregar outras telas, esperar o usuário digitar os dados do cliente para depois gravar (consequentemente irei usar mais que 1 session).

Alguem poderia me ajudar com isso fazendo favor?

Obrigado

Tenta fazer isso na segunda session:

session2.lock&#40;cidades, LockMode.NONE&#41;;

Obrigado por responder Ricardo.
eu fiz isso o que você disse e agora da outro erro

[quote]Hibernate: select cidades0_.codigo as codigo0_, cidades0_.nome as nome0_ from cidades cidades0_ where cidades0_.codigo=?
net.sf.hibernate.HibernateException: cannot lock an unsaved transient instance: [br.com.junior.models.Cidades]
at net.sf.hibernate.impl.SessionImpl.lock(SessionImpl.java:1671)
at br.com.junior.actions.Principal.main(Principal.java:38)
Exception in thread “main” [/quote]

a Segunda session ficou assim

		Session session2 = factory.openSession&#40;&#41;;
		Transaction tx2 = session2.beginTransaction&#40;&#41;;
		session2.lock&#40;cidades,LockMode.NONE&#41;;
		session2.save&#40;clientes&#41;;
		session2.flush&#40;&#41;;
		tx2.commit&#40;&#41;;
		session2.close&#40;&#41;;

Já tentou salvar e depois dar o Lock?

Tentei sim, mas pela lógica primeiro você deve dar lock.

Se eu por o Lock depois do Save, vai dar erro de Duplicate :cry:

Por que voce ta usando 2 sessions? Não consigo ver qual a utilidade.
Uma regrinha de ouro quando se usa o Hibernate é evitar a todo custo misturar objetos de sessions diferentes.
De uma olhada no pattern de unit-of-work, que é o conseito por traz da interface Session.

[quote=“louds”]Por que voce ta usando 2 sessions? Não consigo ver qual a utilidade.
Uma regrinha de ouro quando se usa o Hibernate é evitar a todo custo misturar objetos de sessions diferentes.
De uma olhada no pattern de unit-of-work, que é o conseito por traz da interface Session.[/quote]

No exemplo que eu coloquei ae em cima, realmente não é necessário ter 2 Sessions, mas eu fiz apenas para testar.
No meu projeto “REAL” (nada comercial), minha idéia é criar apenas uma classe DAO. Dentro dessa classe, eu tenho um método chamado insert assim

public static void insert&#40;Object objeto&#41; &#123; try &#123; Session session = factory.openSession&#40;&#41;; Transaction tx = session.beginTransaction&#40;&#41;; session.save&#40;objeto&#41;; session.flush&#40;&#41;; tx.commit&#40;&#41;; session.close&#40;&#41;; &#125; catch &#40;HibernateException e&#41; &#123; e.printStackTrace&#40;&#41;; &#125; &#125;

Eu gostaria de deixar esse método genérico para todos e qualquer tipo de save de objetos.
Assim para eu poder salvar um objeto com relacionamento, na classe que irá chamar o método insert, eu primeiro dou um DAO.load (e carrego a Cidades) e depois eu jogo um DAO.insert (salvo o clientes), consequentemente cada 1 ficando em Sessions diferentes

– Editado—

Idéias para essa solução também são muito bem vindas

Voce tá confundindo quais as responsabilidades de um DAO. Ele deve apenas fazer o leva-e-traz entre seus objetos e o DB, controle de transação e gerenciamento de sessão tem de ficar em outra camada.

Estou querendo implementar um sistema em Hibernate e Webwork.
Estou ainda aprendendo Webwork e hibernate eu sou iniciante (não conhecia o lance de many-to-one).

Agora o que o louds disse sobre o DAO, eu particularmente não sabia.
Será que alguém tem algum exemplo de como funciona as funcionalidade de um DAO e de controle de transação? exemplo básico ou algum sistema que eu possa estudar seu funcionamento?

Obrigado

Alex

Aproveitando o mesmo tópico.

É interessante utilizar Herança para modelar os meus modelos do banco de dados? Lendo a documentação do hibernate me parece que posso usar a tag (subclass) que é responsável por fazer essa herança certo?

Alguém com experiência em Hibernate aconselha fazer herança nesses casos?

Estou passando pelo mesmo problema… tenho o objeto Grupo… e este possui vários Jogadores… eu abro o objeto grupo…e vou injetar os jogadores dentro dele… quando injeto o 1° Jogador funciona blza… na vez do 2°, já era… da esse erro:

15:04:07,408 ERROR JDBCExceptionReporter:78 - Duplicate entry '2' for key 1 15:04:07,546 ERROR AbstractFlushingEventListener:301 - Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) at org.jboss.seam.transaction.HibernateTransaction.commit(HibernateTransaction.java:108) at org.jboss.seam.jsf.SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:603) at org.jboss.seam.jsf.SeamPhaseListener.handleTransactionsAfterPhase(SeamPhaseListener.java:341) at org.jboss.seam.jsf.SeamPhaseListener.afterServletPhase(SeamPhaseListener.java:241) at org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:192) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:280) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:522) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:85) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:177) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:267) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:380) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:507) at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:60) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:68) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:288) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) Caused by: java.sql.BatchUpdateException: Duplicate entry '2' for key 1 at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1666) at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1082) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246) ... 69 more 15:04:07,917 ERROR SeamPhaseListener:197 - uncaught exception java.lang.IllegalStateException: Could not commit transaction at org.jboss.seam.jsf.SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:613) at org.jboss.seam.jsf.SeamPhaseListener.handleTransactionsAfterPhase(SeamPhaseListener.java:341) at org.jboss.seam.jsf.SeamPhaseListener.afterServletPhase(SeamPhaseListener.java:241) at org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:192) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:280) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:522) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:85) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:177) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:267) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:380) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:507) at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:60) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:68) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:288) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) at org.jboss.seam.transaction.HibernateTransaction.commit(HibernateTransaction.java:108) at org.jboss.seam.jsf.SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:603) ... 60 more Caused by: java.sql.BatchUpdateException: Duplicate entry '2' for key 1 at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1666) at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1082) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246) ... 69 more

Minha classe GrupoController que fiz para realizar toda essa transação está desta forma:

@Name("GrupoController")
@Scope(ScopeType.SESSION)
public class GrupoController implements Serializable {

    private Jogador jogador;
    @DataModel("jogadoresDM") //Cria o datamodel para jogadores
    private List<Jogador> jogadores;
    @In //Procura a variavel e instancia ela, no caso o BD
    private Session investDB;
    private Grupo grupo;

    @Begin(join = true)
    public String createSetup() {
        jogadores = new ArrayList<Jogador>(0);

        Criteria c = investDB.createCriteria(Grupo.class);
        c.add(Restrictions.eq("login", Identity.instance().getUsername()));

        grupo = (Grupo) c.uniqueResult();

        jogadores.clear();
        jogadores.addAll(grupo.getJogadores());
        return "createGrupo";
    }

    @End
    public String create() {

        try {
            String senhaCriptografada = null;

            BCodec b = new BCodec();

            senhaCriptografada = grupo.getSenha();

            grupo.setSenha(b.encode(senhaCriptografada));

            //Salva o grupo
            investDB.save(grupo);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Begin(join = true)
    public String createJogadorSetup() {
        jogador = new Jogador();

      //  jogadores = new ArrayList<Jogador>(0);

        return null;
    }

    @End
    public String addJogadorGrupo() {

        grupo.addJogador(jogador);
        jogadores.clear();
        jogadores.addAll(grupo.getJogadores());

        return null;
    }

//getters e setters

Alguém poderia dar uma luz…

Desde já obrigado!