Boa tarde,
Estou com o seguinte erro ao salvar um objeto no banco de dados, no caso é cadastro e não alteração. Ou seja, estou incluindo um registro.
java.sql.BatchUpdateException: ORA-02291: restrição de integridade (SYSTEM.FK_LABORATORIO_LAB_SOFTWARE) violada - chave mãe não localizada
Desativando a restrição FK_LABORATORIO_LAB_SOFTWARE diretamente no BD, percebi que na tabela “laboratorio” foi inserido a linha com valor da sequence, mas na tabela filha, o valor não foi setado na FK, e tentou inserir como 0 (zero).
Quem ai tem a moral de resolver esse problema?
Laboratorio laboratorio = new Laboratorio();
//laboratorio.setCodigo(0);
laboratorio.setNome(nome);
laboratorio.setUnidade(new UnidadeDAO().getUnidadeByID(idUnidade));
laboratorio.setSoftwares(listSoftware);
//Set<Software> soft = (HashSet<Software>)listSoftware;
//laboratorio.setSoftwares((HashSet<Software>)soft);
new LaboratorioDAO().salvar(laboratorio);
DAO:
public void salvar(Laboratorio laboratorio)
{
Session hibSession = HibernateUtil.getSessionFactory().openSession();
hibSession.beginTransaction();
if (laboratorio.getCodigo() > 0)
hibSession.saveOrUpdate(laboratorio);
else
hibSession.merge(laboratorio);
hibSession.getTransaction().commit();
hibSession.flush();
hibSession.close();
}
CLASSE LABORATORIO:
@Entity
@Table(name="LABORATORIO"
,schema="SYSTEM"
)
@SequenceGenerator(name = "seq_lab", sequenceName = "sq_laboratorio", initialValue = 1, allocationSize = 1)
public class Laboratorio implements java.io.Serializable {
private int codigo;
private Unidade unidade;
private String nome;
private List<Software> softwares = new ArrayList<Software>(0);
private List<Agendamento> agendamentos = new ArrayList<Agendamento>(0);
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_lab")
@Column(name="CODIGO", unique=true, nullable=false, precision=22, scale=0)
public int getCodigo() {
return this.codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
@ManyToMany(targetEntity=model.Software.class,
cascade={CascadeType.PERSIST, CascadeType.MERGE},
fetch=FetchType.EAGER)
@JoinTable(name="LABORATORIO_SOFTWARE", schema="SYSTEM", joinColumns = {
@JoinColumn(name="COD_LABORATORIO", updatable=false) }, inverseJoinColumns = {
@JoinColumn(name="COD_SOFTWARE", updatable=false) })
public List<Software> getSoftwares() {
return this.softwares;
}
public void setSoftwares(List<Software> softwares) {
this.softwares = softwares;
}
CLASSE SOFTWARE:
@Entity
@Table(name="SOFTWARE"
,schema="SYSTEM"
)
public class Software implements java.io.Serializable {
private int codigo;
private String nome;
private List<Laboratorio> laboratorios = new ArrayList<Laboratorio>(0);
@ManyToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE},
mappedBy="softwares",
targetEntity=model.Laboratorio.class)
@JoinTable(name="LABORATORIO_SOFTWARE", schema="SYSTEM", joinColumns = {
@JoinColumn(name="COD_SOFTWARE", updatable=false) }, inverseJoinColumns = {
@JoinColumn(name="COD_LABORATORIO", updatable=false) })
public List<Laboratorio> getLaboratorios() {
return this.laboratorios;
}
public void setLaboratorios(List<Laboratorio> laboratorios) {
this.laboratorios = laboratorios;
}