我有以下实体,我试图使用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
的数据),但它并没有插入外来的关键,我无法弄清楚原因。
答案 0 :(得分:1)
您没有在任何地方设置关系的另一面,您应该在双向关系中。添加此
novoDadosFuncionario.setUsuario(novoUsuario);