Estou tendo problemas ao tentar atualizar um registro no meu BD.
Acontece o seguinte: Tenho as classes Pessoa, Endereco e Usuario.
Quando eu tento atualizar um registro na base de dados, ele cria outro registro referente à tabela endereço, ele nao atualiza a tabela como deveria ser…alguem sabe onde estou errando?
Pessoa
@Entity
@Table(name = "pessoa")
@Inheritance(strategy = InheritanceType.JOINED)
public class Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer codigo;
@Column(length = 50, nullable = false)
private String nome;
@Column(length = 11, nullable = false)
private String cpf;
@Column(length = 50, nullable = false)
private String email;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "cod_endereco")
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.ALL)
private Endereco endereco;
// getters and setters
}
Endereco
@Entity
@Table(name = "endereco")
public class Endereco implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer codigo;
@Column(length = 50, nullable = false)
private String logradouro;
@Column(length = 5, nullable = false)
private String numero;
@Column(length = 20)
private String complemento;
@Column(length = 50, nullable = false)
private String bairro;
@Column(length = 8, nullable = false)
private String cep;
@Column(length = 50, nullable = false)
private String cidade;
@Column(length = 2, nullable = false)
private String estado;
@OneToMany(mappedBy = "endereco", fetch = FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
private List<Pessoa> pessoas;
// getters and setters
}
Usuario
@Entity
@Table(name = "usuario")
@PrimaryKeyJoinColumn(name = "cod_pessoa")
public class Usuario extends Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Column(length = 20, nullable = false)
private String login;
@Column(length = 15, nullable = false)
private String senha;
// getters and setters
}
Código de inserção (Ok)
Usuario u = new Usuario();
u.setEmail("administrador@master.com");
u.setNome("Administrador");
u.setLogin("admin");
u.setSenha("admin");
u.setCpf("22222222222");
Endereco e = new Endereco();
e.setBairro("Centro");
e.setCep("11111111");
e.setCidade("City");
e.setEstado("SP");
e.setLogradouro("Rua C");
e.setNumero("14");
u.setEndereco(e);
UsuarioController uc = new UsuarioController();
uc.saveOrUpdate(u);
Código de alteração (cria outro registro de endereço, mesmo se eu nao atualizar nada em endereço)
Usuario u = new Usuario();
u.setCodigo(1);
u.setEmail("administrador@master.com");
u.setNome("Administrador");
u.setLogin("admin123");
u.setSenha("admin123");
u.setCpf("11111111111");
Endereco e = new Endereco();
e.setBairro("Centro");
e.setCep("11111111");
e.setCidade("City");
e.setEstado("SP");
e.setLogradouro("Rua A");
e.setNumero("123");
u.setEndereco(e);
UsuarioController uc = new UsuarioController();
uc.saveOrUpdate(u);
Log do hibernate
Hibernate:
insert
into
endereco
(bairro, cep, cidade, complemento, estado, logradouro, numero)
values
(?, ?, ?, ?, ?, ?, ?)
Hibernate:
update
pessoa
set
cpf=?,
email=?,
cod_endereco=?,
nome=?
where
codigo=?
Hibernate:
update
usuario
set
login=?,
senha=?
where
cod_pessoa=?