Tenho duas classe: pessoa e telefone. Uma pessoa tem uma lista de telefones. Usando o relacionamento de OneToMany em pessoa e ManyToOne em telefone, como se pode ver no código abaixo.
Classe Pessoa
public class Pessoa implements GenericEntity<Integer>, Serializable{
...
@OneToMany(cascade=CascadeType.ALL, mappedBy="pessoa", fetch = FetchType.EAGER)
private List<Telefone> telefones;
...
Classe Telefone
public class Telefone implements GenericEntity<Integer>, Serializable{
...
@ManyToOne
@JoinColumn(name="id_pessoa")
private Pessoa pessoa;
...
Está inserido normalmente uma pessoa e automaticamente fazendo insert na tabela Telefones a lista que foi passada.
Mas quando eu faço um atualização modificando a lista de telefone, ou excluindo algum telefone da lista, não está fazendo update e nem delete na tabela Telefones.
segue abaixo o codigo que está sendo executado no meu controller.
/**
* Adicionando ao telefone a pessoa
*/
for (Telefone tel : getTelefones()) {
tel.setPessoa(pessoa);
}
/**
* Adicionando a pessoa a lista de telefone
*/
pessoa.setTelefones(getTelefones());
grato pela atenção de todos.
se estiver usando JPA 2 vc pode fazer isso:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "mapId", orphanRemoval = true)
se estiver usando o Hibernate pode fazer isso:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "mapId")
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
com isso
@ManyToOne
@JoinColumn(nullable = false)
private MyEntity entity;
Beleza, nextuser
Vou fazer as modificações…
Fala galera!
@carlosgeorge, conseguiu resolver seu problema?
Eu tenho uma tabela que tem um relacionamente de @OneToMany com mais de duas outras tabelas. Segui a configuração sugerida pelo nextuser e funcionou apenas quando configurei o relacionamento com 1 tabela, quando configurei com a segunda deu o seguinte erro:
hibernate.HibernateException: cannot simultaneously fetch multiple bags
Pesquisando encontrei aqui => https://forum.hibernate.org/viewtopic.php?t=959478 a solução que é trocar o FetchType.EAGER por FetchType.LAZY. Testei e funcionou.
Agora gostaria de levantar a minha dúvida. Por que o EAGER só funcionou com uma relação e o LAZY funciona com mais de 1 relação?
Abraços,
Neste tópico => http://community.jboss.org/thread/107685?tstart=0 e o usuário Emmanuel disse o seguinte:
Ainda não testei mas ao que parece se eu quiser utilizar o FetchType.EAGER devo trocar o List por Set ou se quiser utilizar o List apontar o @IndexColumn
E se eu deixar com FetchType.LAZY, vou perder muito desempenho das minhas queryes?
danilocmiranda,
Eu resolvi de outra forma. Pegando o Objeto que queria remover e removendo direto da tabela,
Fiz uma lista dos objetos para remover, depois percorri essa lista removendo objeto por objeto.
Sei que é um gambiarra, mas a unica forma q consegui.
Vou testar dessa forma que vc mencionou.
Galera, problemas
Depois que coloquei mais de um relacionamento @OneToMany na minha entidade de persistência minhas listas resultantes destas dependências esta com o erro:
Pelo que lí isso ocorre por causa do LAZY…
Como faço para colocar mais de um relacionamento oneToMany se quando eu uso EAGER ele dá o erro
E quando uso LAZY este erro
Ajuda é bem vinda!