Problemas ao persistir uma Collection no Hibernate Annotations

1 resposta
W

Olá pessoal,

Estou com o seguinte problema:
Tenho as tabelas:
Funcionario
DRT<>
Nome

RO
IDRO<>
DRT<>
Data

Testemunha
DRT<><>
IDRO<><>

Classe Funcionario

@Entity
@Table(name="funcionario")
public class Funcionario implements java.io.Serializable {
    
    
     @Id
    @Column(name="drt_funcionario", unique = true, nullable = false)
    private int drt;
    private String nome;
    private String senha;
    
   //Metodos Get e Set

 }

Classe RO

@Entity
@Table(name="ro")
public class Ro implements java.io.Serializable {
    @Id
    @Column(name="idro", unique = true, nullable = false)
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int idro;
    private String tipo;
    private String unidade;
    @Column(name="local")
    private String localRo;
    @Temporal(value = TemporalType.DATE)
    @Column(name="data")
    private Date dataRo;
    private String horario;
    private String envolvido;
    @Column(name="tipoenvolvido")
    private String tipoEnvolvido;
    private String relato;
    private String providencia;
    @Column(name="assist_medica")
    private String assistenciaMedica;
    private boolean afastamento;
    @Column(name="atendido_por")
    private String atendidoPor;
    @Column(name="local_atend")
    private String localAtendimento;
    private String lesao;
    private String observacao;
    private String efeito;
    
    @ManyToOne
    @JoinColumn(name="drt_funcionario", nullable = false)
    private Funcionario funcionario;

        @ManyToMany(
    targetEntity=classes.Funcionario.class)
            //cascade=CascadeType.ALL
    
    @JoinTable(name="testemunha",
        joinColumns=@JoinColumn(name="idro"),
        inverseJoinColumns=@JoinColumn(name="drt_funcionario"))
    private Collection funcionarios = new ArrayList();

Classe HibernateTeste

public class HibernateTeste {
    
         
            
            //Povoando o objeto funcionario
            Funcionario funcionario = new Funcionario();
            funcionario.setDrt(5);
            funcionario.setNome("teste");
            funcionario.setSenha("teste");
            
            //Adicionando o objeto funcionario na Collection
            Collection funcionarios = new ArrayList();
            funcionarios.add(funcionario);
            
            //Povoando o objeto ro
            Ro ro = new Ro();
            ro.setUnidade("Teste");
            ro.setDataRo(data);
            ro.setFuncionario(funcionario);
            
            //Povoando outro objeto funcionario
            funcionario.setDrt(6);
            funcionario.setNome("teste2");

            //adicionando objeto funcionario na Collection
            funcionarios.add(funcionario);

           //Setando a collection de funcionarios no objeto RO
            ro.setFuncionarios(funcionarios);
          
            Session session = HibernateUtil.getSession();
            session.beginTransaction();
            session.save(ro);
            session.getTransaction().commit();

            
        } catch (HibernateException e) {
            e.printStackTrace();
        }
    }
}

O problema é que quando eu tento persistir o objeto RO que tem a collection de funcionários e deveria persistir no banco na tabela Testemunha, ele dá um erro como se tentasse gravar 2 vezes a mesma combinação de PK e FK. Só funciona se eu setar apenas um funcionário na collection. O que estou fazendo errado?

O seguinte erro é exibido no NetBeans

Hibernate: select funcionari_.drt_funcionario, funcionari_.nome as nome0_, funcionari_.senha as senha0_ from funcionario funcionari_ where funcionari_.drt_funcionario=?
Hibernate: insert into ro (tipo, unidade, local, data, horario, envolvido, tipoenvolvido, relato, providencia, assist_medica, afastamento, atendido_por, local_atend, lesao, observacao, efeito, drt_funcionario) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into testemunha (idro, drt_funcionario) values (?, ?)
Hibernate: insert into testemunha (idro, drt_funcionario) values (?, ?)
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:249)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:143)
        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 teste.HibernateTeste.main(HibernateTeste.java:94)
Caused by: java.sql.BatchUpdateException: Duplicate entry '23-6' for key 1
        at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:652)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
        ... 8 more

1 Resposta

F

Olá,

Quando tu for inserir o segundo funcionario, cria uma outra instancia.

//Povoando outro objeto funcionario Funcionario funcionario2 = new Funcionario();

]['s

Criado 14 de fevereiro de 2007
Ultima resposta 14 de fev. de 2007
Respostas 1
Participantes 2