Hibernate不会删除/更新一对多

时间:2014-06-23 11:10:18

标签: java database spring hibernate

我正在努力学习如何使用hibernate,直到现在我还以为我做得很好...... 问题是,我有一对多的关系,我无法更新/删除。 我的数据库非常基本,我有一个ClientsBasic与IndirectClients有一对多的关系(它只有一个ClientsBasic ID和一个URL,这两个键因为你可以拥有相同的ID大量的URL)

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;
}

现在,如果我尝试删除ClientsBasic,它将删除ClientsBasic和所有相关的indirectClients,因此它按预期工作,但如果我只是尝试更新/删除并在indirectClients中输入它不起作用。

实施例: 我创建了一个新的客户端

ClientsBasic cb = new ClientsBasic("company_1", 1234, "company_1@email.com");
cbDao.save(cb);

然后是一个新的间接客户端

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);

现在,如果我尝试更改这样的网址

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

数据库中没有任何更改。

有人可以帮帮我吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

如果您的IndirectClients被定义为实体,则它有自己的生命周期,这意味着您必须与ClientBasic父项分开保留/删除实例。 如果您想要通过父关系管理所有子项的方案,请考虑使用ElementCollection

另见JPA: When to choose Multivalued Association vs. Element Collection Mapping