Problemas ao remover item com Hibernate

3 respostas
F

Olá galera,

Seguinte, to com problema pra revomer um item de um Set de uma entity root. O problema é que eu removo o item da collection na boa, mas quando executo o merge(obj) e faço o commit o objeto retornado continua com o item lá na collection.

Tenho certeza que é algo que eu não to sabendo fazer e é por isso que eu to aqui. :slight_smile:

Como bom perguntador, seguem os trechos de código pertinentes.

Relacionamento no objeto root.

@OneToMany(mappedBy = "event", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Subscription> subscriptions;

Relacionamento no objeto que eu quero remover.

@ManyToOne(cascade = CascadeType.ALL, optional = false)
    @JoinColumn(name = "eventId", referencedColumnName = "id")
    private Event event;

Código onde eu removo o objeto e peço o update.

event.remove(subscription);
repository.update(event);

Tem um Decorator no meio dessa chamada mas tudo o que ele faz é chamar o metodo merge do DAO conforme nesse código.

public PersistentObject merge(PersistentObject obj) {
        em = getEntityManager();
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin();
            obj = em.merge(obj);
            tx.commit();
            return obj;
        } catch (PersistenceException pe) {
            pe.printStackTrace();
            if (tx.isActive())
                tx.rollback();
            throw pe;
        } finally {
            close();
        }
}

E aí? Alguma dica?

Abração,

3 Respostas

F

Vou levar em consideração que um Event possue várias Subscriptions.

Como é o método event.remove(Subscription)?

Imagino que você percorra a lsita subscription, remova a subscription desejada e sete a collection novamente no Evente(sem a subscription removida). É isto?

F

Um evento possui várias subscriptions conforme a seguir:

@OneToMany(mappedBy = "event", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Subscription> subscriptions;

Eu só não faço percorro a lista porque implementei o metodo equals e o hashCode para a classe Subscriptions. Aí só uso o remove do HashSet conforme mostrado a seguir:
O metodo subscriptionWithId() percorre o Set para retornar o objeto atualizado e completo.

Subscription s = (Subscription) obj;
     s = this.subscriptionWithId(s.getId());
     subscriptions.remove(s);
F

Só para descargo de conciência, ao invés de fazer subscriptions.remove(s);
tente criar um novo Set sem o Subscription que foi removido, setar o set inteiro(event.setSusbscription(mySusbscriptions)) e persistir denovo o Event.

Criado 2 de junho de 2008
Ultima resposta 2 de jun. de 2008
Respostas 3
Participantes 2