Po tenho 2 classes PessoaFisica e Dependente, quando eu deletar um dependente referente a uma PessoaFisica não pode deletar a PessoaFisica também que é o que está ocorrendo. Alguém saberia porque?? se eu tirar o cascade = CascadeType.ALL, quando vou cadastrar um dependente ele não vai, e para deletar também não, nem sei se na hora de gravar estou usando o JPA corretamente, estou recuperando a chave primária da pessoaFisica, passando para o objeto de Dependente para gravar como no código abaixo
dependente.setNome(painelDepNovos.getCampoDepNovNomeDep().getText().toUpperCase());
dependente.setCpf(painelDepNovos.getCampoDepCpf().getText());
PessoaFisica pessoaFisica = dependentesDAO.buscaPessoa(idSelecionado);
dependente.setPessoaFisica(pessoaFisica);
dependentesDAO.novoCadastro(dependente)
Na entidade Dependente tem
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id_pessoa_fisica")
private PessoaFisica pessoaFisica;
- acho que não faria sentido cascadeType.ALL, pois não quero que delete o registro de PessoaFisica no banco, mas se eu tirar ele dá o erro
javax.persistence.EntityNotFoundException: deleted entity passed to persist: [modelo.Dependente#<null>]
já na Entidade PessoaFisica tenho
@OneToMany(mappedBy="pessoaFisica", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private List<Dependente> dependentes;
Ai sim faz sentido, quando deletar PessoaFisica sair deletando tudo referente a ela
- Desde já valeu Jareilton pelo toque que nome de entidade fica no singular[/code]
Tente fazer isso:
@ManyToOne
@JoinColumn(name = "id_pessoa_fisica")
private PessoaFisica pessoaFisica;
[code]PessoaFisica pessoaFisica = dependentesDAO.buscaPessoa(idSelecionado);
pessoaFisica.getDependentes().add(dependente);
pessoaDAO.atualizarPessoa(pessoaFisica);[/code]
obs.: esse metodo atualizarPessoa() faz um EntityManager.persist(pessoaFisica)
E na minha opinião Dependente não é uma entidade forte o suficente pra ser persistida sozinha, e conseguentemente ter um DAO, mas isso é uma decisão sua.
[quote=“jairelton”]Tente fazer isso:
pessoaFisica.getDependentes().add(dependente);
Nessa linha não seria
remove ao invés de add??
bem, tentei as duas maneiras, ainda adicionei um merge antes do persist
pessoaFisica = manager.merge(pessoaFisica);
manager.persist(pessoaFisica);
Engraçado que não dá erro mas também não exclui.
Você implementou equals() e hashCode() adequadamente para essas classes?
Putz essa é a parte que nunca coloquei, vc vai me quebrar um galhão se me mostrar um exemplo de como ficaria na minha, para eu ter uma base e aé usar futuramente, me dá uma ajuda ae cara… To batendo cabeça com o JPA, não existe livros em português, matérias são básicas, até do Java Magazine, quebra essa ae??? e se tiver algum site bom também de uma especificação mais completa, a API só fala para q serve e muito, mas muito vago…
Busquei na internet sobre o assunto e vi que é baseado pelo atributo que é referente a chave primária, joguei o código nas duas classes Dependentes e PessoaFisica, cada um se referindo ao atributo de sua classe.
public int hashCode()
{
int hash = 0;
hash += (this.idDependentes != null ? this.idDependentes.hashCode() : 0);
return hash;
}
public boolean equals(Object object)
{
if(object == null || !this.getClass().equals(object.getClass()))
{
return false;
}
Dependente outro = (Dependente) object;
if(this.idDependentes != outro.idDependentes && (this.idDependentes == null ||
!this.idDependentes.equals(outro.idDependentes)))
{
return false;
}
return true;
}
Outra dúvida preciso usar esses métodos em algum lugar??? ou framework ou java que manipula internamente???
Obrigado pela paciência
Veja um exemplo simples:
[code]public class Dependente{
private int id;
//get & set
public boolean equals(Object obj){
if(obj != null && obj instanceof Dependente){
Dependente dep = (Dependente) obj;
return getId()==dep.getId();
}
return false;
}
public int hashCode(){
return Integer.valueOf(getId()).hashCode()*31;
}
}[/code]
Poxa sei que tu tá fazendo de tudo ae pra me ajudar, mas não entendo pq não tá indo, não tá dando erro
Fiz até uma classe aparte para testar
private EntityManagerFactory factory;
private EntityManager manager;
public static void main(String[] args)
{
TesteClasse testeClasse = new TesteClasse();
PessoaFisica pessoaFisica = testeClasse.busca(2);
List<Dependente> lista = pessoaFisica.getDependentes();
Dependente dependente = lista.get(0);
// tá pegando e removendo certinho
pessoaFisica.getDependentes().remove(dependente);
testeClasse.alterarCadastro(pessoaFisica);
}
public PessoaFisica busca(Integer id)
{
factory = Persistence.createEntityManagerFactory("banco");
manager = factory.createEntityManager();
PessoaFisica pessoaFisica = manager.find(PessoaFisica.class, id);
return pessoaFisica;
}
public boolean alterarCadastro(PessoaFisica pessoaFisica)
{
factory = Persistence.createEntityManagerFactory("banco");
manager = factory.createEntityManager();
EntityTransaction tx = manager.getTransaction();
tx.begin();
try
{
pessoaFisica = manager.merge(pessoaFisica);
manager.persist(pessoaFisica);
manager.flush();
manager.clear();
tx.commit();
}
catch (RuntimeException e)
{
tx.rollback();
JOptionPane.showMessageDialog(null, e, "Erro!", 0);
manager.close();
factory.close();
return false;
}
manager.close();
factory.close();
return true;
}
@Entity
@Table(name = "dependentes")
public class Dependente
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_dependentes", nullable = false)
private Integer idDependentes;
@Column(nullable = false)
private String nome;
@ManyToOne
@JoinColumn(name = "id_pessoa_fis")
private PessoaFisica pessoaFisica;
// get e set
public boolean equals(Object obj){
if(obj != null && obj instanceof Dependente){
Dependente dep = (Dependente) obj;
return getIdDependentes()==dep.getIdDependentes();
}
return false;
}
public int hashCode(){
return Integer.valueOf(getIdDependentes()).hashCode()*31;
}
}
@Entity
@Table(name = "pessoa_fisica")
public class PessoaFisica
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_pessoa_fisica", nullable = false)
private Integer idPessoaFisica;
@Column(nullable = false)
private String nome;
@OneToMany(mappedBy="pessoaFisica", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private List<Dependente> dependentes;
// get e set
Na tabela
–pessoa_fisica–
id_pessoa_fisica pk
nome
–Dependente–
id_dependente pk
nome
id_pessoa_fis fk