Hibernate não seta valor chave estrangeira ao salvar

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;
    }

Você parece não ter colocado CASCADE na classe Laboratorio no mapeamento ManyToMany para Software. Na verdade, nem vi nenhum mapeamente da lista de softwares na classe Laboratorio. Você omitiu esse trecho de código?

Fernando, realmente não percebi que peguei o pedaço de código errado.
Muito obrigado, já editei o tópico.

Pelo que vi, você está mapeando dos dois lados com @JoinTable. Tenta mapear de um só lado e no outro usar ‘mappedBy’.