使用Hibernate保存级联

时间:2015-03-30 15:27:27

标签: java hibernate postgresql

我有以下实体,我试图使用hibernate cascade保存它们:

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

usuarios的表格结构:

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

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

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
)

然后测试它是否按照预期的方式保存了所有内容,我是这样做的:

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();            

它将正确的数据插入到正确的表中,但它不会将usuarios中的外键保存在dados_funcionario中(使用id_usuario填充列null) 。所以,它理解了这种关系(它以级联方式保存,因为我只使用了novoUsuario的session.save()并且它保存了来自novoDadosFuncionario的数据),但它并没有插入外来的关键,我无法弄清楚原因。

1 个答案:

答案 0 :(得分:1)

您没有在任何地方设置关系的另一面,您应该在双向关系中。添加此

novoDadosFuncionario.setUsuario(novoUsuario);