Olá pessoal,
Estou com o seguinte problema:
Tenho as tabelas:
Funcionario
DRT<<PK>>
Nome
…
RO
IDRO<<PK>>
DRT<<FK>>
Data
…
Testemunha
DRT<<PK>><<FK>>
IDRO<<PK>><<FK>>
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();
//Metodos Get and Set
}
Classe Hibernate Teste
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