E ai galera, to com uma dúvida referente a questão do OneToMany… Ja pesquisei em varios lugares e não achei nenhuma resposta…
Classe Cliente
@Entity
public class Cliente extends Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "rg", length = 20)
private String rg;
@Enumerated(EnumType.STRING)
private SexoEnum sexo;
@Column(name = "limiteCredito")
private Double limiteCredito;
@ManyToOne
@JoinColumn(name = "codigo_banco")
private Banco banco;
@Column(name = "nome_conta", length = 60)
private String nomeConta;
@Column(name = "numero_conta", length = 10)
private String numeroConta;
@Column(name = "numero_agencia", length = 10)
private String numeroAgencia;
@Column(name = "digito_agencia", length = 5)
private String digitoAgencia;
@Column(name = "digito_conta", length = 5)
private String digitoConta;
....
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long codigo_pessoa;
@Column(name = "nome_razao", length = 100)
private String nomeRazao;
@Column(name = "nome_fantasia", length = 100)
private String nomeFantasia;
@Column(name = "cpf_cnpj", length = 20)
private String cpfCnpj;
@Enumerated(EnumType.STRING)
private TipoPessoaEnum tipoPessoa;
@Column(name = "inscricao_estadual", length = 20)
private String inscricaoEstadual;
@Column(name = "inscricao_municipal", length = 20)
private String inscricaoMunicipal;
@Lob
@Type(type = "org.hibernate.type.TextType")
@Column(name = "observacoes")
private String observacoes;
@Enumerated(EnumType.STRING)
private SituacaoPessoaEnum situacaoPessoa;
@ManyToOne
@JoinColumn(name = "codigo_estabelecimento")
private Estabelecimento estabelecimento;
@OneToMany(mappedBy = "pessoa")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private Collection<Endereco> enderecos;
@OneToMany(mappedBy = "pessoa")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private Collection<Email> emails;
@OneToMany(mappedBy = "pessoa")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private Collection<Telefone> telefones;
Até aqui tudo certo, a questão é, na hora de salvar os endereços desse cliente eu faço assim:
e na hora de salvar, ele salva todos os endereços e o cliente normal,sem precisar persistir o endereço antes da pessoa!
O problema é quandoo eu excluo um endereço, o endereço continua aparecendo!
Então eu mexi no edit do ClienteJpaController:
public void edit(Cliente cliente) throws NonexistentEntityException, Exception {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
//retorna o objeto salvo no banco de dados
Cliente persistentCliente = em.find(Cliente.class, cliente.getCodigo_pessoa());
/**
* ENDEREÇOS
*/
//carrega os endereçoes antigos
Collection<Endereco> enderecosOld = persistentCliente.getEnderecos();
//carrega os novos endereços
Collection<Endereco> enderecosNew = cliente.getEnderecos();
//passa por todos os endereços antigos
for (Endereco enderecosOldEndereco : enderecosOld) {
//se nos novos endereços nao conterem o antigo, significa q foi excluido
if (!enderecosNew.contains(enderecosOldEndereco)) {
enderecosOldEndereco.setSituacao(false);
enderecosOldEndereco = em.merge(enderecosOldEndereco);
}
}
/**
* EMAILS
*/
//carrega os endereçoes antigos
Collection<Email> emailOld = persistentCliente.getEmails();
//carrega os novos endereços
Collection<Email> emailNew = cliente.getEmails();
//passa por todos os endereços antigos
for (Email emailOldEmail : emailOld) {
//se nos novos endereços nao conterem o antigo, significa q foi excluido
if (!emailNew.contains(emailOldEmail)) {
emailOldEmail.setSituacao(false);
emailOldEmail = em.merge(emailOldEmail);
}
}
//salva as informações
cliente.setEmails(emailNew);
cliente.setEnderecos(enderecosNew);
cliente = em.merge(cliente);
em.getTransaction().commit();
} catch (Exception ex) {
String msg = ex.getLocalizedMessage();
if (msg == null || msg.length() == 0) {
Long id = cliente.getCodigo_pessoa();
if (findCliente(id) == null) {
throw new NonexistentEntityException("The cliente with id " + id + " no longer exists.");
}
}
em.getTransaction().rollback();
throw ex;
} finally {
if (em != null) {
em.close();
}
}
}
No caso ele verifica o q foi excluido e seta a situação como FALSE!
Tem algum jeito que facilite isso? pq se não, em todos os lugares terei q criar essa estrutura…
[]'s