Snox
Snox

Reputation: 588

Hibernate not deleting/updating one to many

I am trying to learn how to work with hibernate, and until now i thought i was doing ok... The problem is, i have a one to many relationship that i can't update/delete. My DB is pretty basic, i have a ClientsBasic that has a one to many relationship with IndirectClients (which simply has a ClientsBasic ID and a URL, both keys because you can have for the same ID lots of URLs)

ClientBasic:

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "clientsBasic", cascade=CascadeType.ALL)
    public List<IndirectClients> getIndirectClients() {
        return this.indirectClients;
    }

    public void setIndirectClients(List<IndirectClients> indirectClients) {
//      this.indirectClients = indirectClients;
        this.indirectClients.clear();
        this.indirectClients.addAll(indirectClients);
    }

ClientDao:

public ClientsBasic save(ClientsBasic client) throws HibernateException {
    Transaction tx = null;
    tx = session.beginTransaction();
    session.saveOrUpdate(client);
    tx.commit();
    log.info("Client saved with id: " + client.getClientId());

    return client;
}

Now if i try to delete ClientsBasic, it will delete both ClientsBasic and all related indirectClients, so its working as expected, but if i simply try to update/delete and entry in indirectClients it doesn't work.

Example: I create a new Client

ClientsBasic cb = new ClientsBasic("company_1", 1234, "[email protected]");
cbDao.save(cb);

And then a new Indirect Client

List<IndirectClients> indirectClientsSet= new ArrayList<IndirectClients>();
indirectClientsSet.add(new IndirectClients(new IndirectClientsId(cb.getClientId(), "www.url.test_1.com"), cb));
cb.setIndirectClients(indirectClientsSet);
cbDao.save(cb);

Now if i try to change the url like this

ClientsBasic cb = cbDao.findClientById(1);
List<IndirectClients> indC = cb.getIndirectClients();   
indC.get(0).getId().setUrl("TEST");
cb.setIndirectClients(indC);
cbDao.save(cb);

no changes are made in the DB.

Can someone please help me? Thank you.

Upvotes: 0

Views: 248

Answers (1)

Fradenger
Fradenger

Reputation: 596

If your IndirectClients is defined as an Entity it has its own life cycle, meaning you have to persist/delete instances separately from their ClientBasic parent. If you want a scenario where all children are managed through their parent relation, consider using ElementCollection.

See also JPA: When to choose Multivalued Association vs. Element Collection Mapping

Upvotes: 1

Related Questions