Dúvida com JPA

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!