Merge JPA - Hibernate

Olá a todos,
Estou tendo um probleminha para fazer um merge.

Situação:
Tenho uma entidade A que contém uma lista de B.

mapeamento em A:

@OneToMany(cascade = {CascadeType.ALL}, mappedBy=“a”)
private List bs;

mapeamento em B:

@ManyToOne
@JoinColumn(name = “ID_A”)
private A a;

Situação real:
Tenho umA qa entidade ue tem 3 entidades b e gostaria de atualizar a A removendo um B (somente esta atualização).
Estou fazendo o seguinte retiro o B da lista de A (a.getBs().remove(0) //neste caso removi o primeiro elemente da lista) e faço um MERGE, porém o B não está sendo excluído do banco.

Já fiz algumas buscas pelo google e não obtive muito sucesso.

Gostaria de saber se alguém aqui já passou por isso ou sabe alguma solução.

Obrigado a todos!!!

[quote=fontoura]Olá a todos,
Estou tendo um probleminha para fazer um merge.

Situação:
Tenho uma entidade A que contém uma lista de B.

mapeamento em A:

@OneToMany(cascade = {CascadeType.ALL}, mappedBy=“a”)
private List bs;

mapeamento em B:

@ManyToOne
@JoinColumn(name = “ID_A”)
private A a;

Situação real:
Tenho umA qa entidade ue tem 3 entidades b e gostaria de atualizar a A removendo um B (somente esta atualização).
Estou fazendo o seguinte retiro o B da lista de A (a.getBs().remove(0) //neste caso removi o primeiro elemente da lista) e faço um MERGE, porém o B não está sendo excluído do banco.

Já fiz algumas buscas pelo google e não obtive muito sucesso.

Gostaria de saber se alguém aqui já passou por isso ou sabe alguma solução.

Obrigado a todos!!![/quote]

Tente assim no mapeamento A:


@OneToMany(cascade = {CascadeType.ALL}, mappedBy=“a”)
@Cascade(value={org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private List bs;

Putz!! Tbm não funcionou!!

Alguma outra sugestão??

Obrigado!!!

Pq vc nao remove usando o EntityManager direto ?

Entidade entidade = a.getBs().item(0); // hipotético, só pra entender que é a recuperação do item da coleção.

em.remove(entidade);
em.merge(a);

Att.
Edson.

[quote=edson.goncalez]Pq vc nao remove usando o EntityManager direto ?

Entidade entidade = a.getBs().item(0); // hipotético, só pra entender que é a recuperação do item da coleção.

em.remove(entidade);
em.merge(a);

Att.
Edson.[/quote]

É justamente esse trabalho que estava querendo evitar… Eu achei que o JPA (Hibernate) entenderia de alguma forma que quando eu desse um merge em “a” sem alguns filhos, os filhos que não estivessem na lista seriam excluidos!

Na verdade o método que irá atualizar já recebe “a” sem os elementos da lista de B.

O que estou fazendo é consultando denovo e removendo os Bs que não estão na lista de A.

Obrigado a todos

tente comitar =P

pq o que vc falou funciona sim

A a = em.find(A.class,1); a.getBs().remove(0); em.getTransaction().begin(); em.marge(a); em.getTransaction().commit(); em.fulsh();

[quote=Lavieri]tente comitar =P

pq o que vc falou funciona sim

A a = em.find(A.class,1); a.getBs().remove(0); em.getTransaction().begin(); em.marge(a); em.getTransaction().commit(); em.fulsh();[/quote]

Desculpe a pergunta desconfiada, mas vc já conseguiu testar isso ou fazer funcionar?
Estou perguntando isso, pq tbm já ouvi falar que isso funciona, mas não está funcionando na minha aplicaçao!!!

Obrigado!!!

sim ja fiz

sim funciona

sim consegui sim

posta suas entidades ai =P … pode ser algum misterio nelas =x

Edit.: eu particularmente não gosto disso, mas ja usei antes, acho muito esposto… eu não gosto de deixar minha list exposta no getBs() então faço + ou - assim

[code]public List getBs() { //é impossivel alguem dar ADD ou Remove aki
Collections.unmodifiableCollection(bs);
}

private List getModifiableBs() { //repare que é private
return bs;
}

public boolean remove(B b) {
return getModifiableBs().remove(b);
}

public void add(B b) {
//primeiro testo se B pode realmente ser adcionado
getModifiableBs().add(b);
}[/code]

mas essa abordagem é a mesma q vc usa, so muda o encapsulamento