我正在努力学习如何使用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);
数据库中没有任何更改。
有人可以帮帮我吗? 谢谢。
答案 0 :(得分:1)
如果您的IndirectClients
被定义为实体,则它有自己的生命周期,这意味着您必须与ClientBasic
父项分开保留/删除实例。
如果您想要通过父关系管理所有子项的方案,请考虑使用ElementCollection。
另见JPA: When to choose Multivalued Association vs. Element Collection Mapping