0

I have the following entities and I'm trying to save them using hibernate cascade:

Entity Usuario:

@Entity
@Table(schema="system", name="usuarios")
public class Usuario {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(nullable = false)
    private String nome;
    @Column(name = "data_nascimento")
    private Date dataNascimento;
    private String sexo;
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "usuario")
    private DadosFuncionario dadosFuncionario;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public Date getDataNascimento() {
        return dataNascimento;
    }
    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }
    public String getSexo() {
        return sexo;
    }
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }
    public DadosFuncionario getDadosFuncionario() {
        return dadosFuncionario;
    }
    public void setDadosFuncionario(DadosFuncionario dadosFuncionario) {
        this.dadosFuncionario = dadosFuncionario;
    }
}

Table structure for usuarios:

CREATE TABLE "system"."usuarios" (
    "id" int4 NOT NULL,
    "data_nascimento" date,
    "nome" varchar(255) COLLATE "default" NOT NULL,
    "sexo" varchar(255) COLLATE "default"
)

Entity DadosFuncionario:

@Entity
@Table(schema = "system", name = "dados_funcionario")
public class DadosFuncionario {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(unique = true)
    private String matricula;
    @Column(name = "pref_reg", nullable = true)
    private int prefReg;
    @Column(name = "pref_dep", nullable = false)
    private int prefDep;
    @Column(nullable = true)
    private String telefone;
    @OneToOne
    @JoinColumn(name = "id_usuario")
    private Usuario usuario;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getMatricula() {
        return matricula;
    }
    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }
    public int getPrefReg() {
        return prefReg;
    }
    public void setPrefReg(int prefReg) {
        this.prefReg = prefReg;
    }
    public int getPrefDep() {
        return prefDep;
    }
    public void setPrefDep(int prefDep) {
        this.prefDep = prefDep;
    }
    public String getTelefone() {
        return telefone;
    }
    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
    public Usuario getUsuario() {
        return usuario;
    }
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
}

Table structure for dados_funcionario:

CREATE TABLE "system"."dados_funcionario" (
    "id" int4 NOT NULL,
    "matricula" varchar(255) COLLATE "default",
    "pref_dep" int4 NOT NULL,
    "pref_reg" int4,
    "telefone" varchar(255) COLLATE "default",
    "id_usuario" int4
)

And then to test if it was saving everything the way it was supposed to, I'm doing this:

Usuario novoUsuario = new Usuario();
DadosFuncionario novoDadosFuncionario = new DadosFuncionario();

novoDadosFuncionario.setMatricula("XXXXXXXXX");
novoDadosFuncionario.setPrefDep(9999);
novoUsuario.setNome("XXXXX XXXXX");             
novoUsuario.setDadosFuncionario(novoDadosFuncionario);

Transaction tx = session.beginTransaction();
session.save(novoUsuario);
tx.commit();            

It insert the correct data into the correct tables, but it does not save the foreign key of usuarios in dados_funcionario (its filling the column id_usuario with null). So, it understands the relationship (it saved in cascade, because I only used the session.save() with novoUsuario and it saved the data from novoDadosFuncionario) but it doesn't insert the foreign key and I can't figure out why.

1 Answer 1

1

You are not setting the other side of the relation anywhere, which you should in bidirectional relationships. Add this

novoDadosFuncionario.setUsuario(novoUsuario);
Sign up to request clarification or add additional context in comments.

1 Comment

Wow. I can't believe that I didn't thought that... So simple... I think it's time to have a break and drink some coffee. Thanks!! Saved my morning!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.