根据我的要求,我在Customer和Manager之间使用JPA创建了ManyToOne关系
class CustomerEntity{
@ManyToOne
@JoinColumn(name = "manager_id", referencedColumnName = "id")
private ManagerEntity manager;
}
class ManagerEntity{
@OneToMany(mappedBy = "manager", fetch = FetchType.LAZY)
private List<CustomerEntity> customerlist;
}
现在,我正在尝试使用以下代码更新/重新分配Manager给客户
public void updateManager(Customer customer) throws Exception {
CustomerEntity customerEntity = customerDao.find(customer.getId());
ManagerEntity managerEntity = userDao.find(customer.getManagerId());
customerEntity.setManager(managerEntity);
getSession().update(entity);
}
但是在保存的同时我会得到下面提到的例外
引起:org.hibernate.HibernateException:ManagerEntity实例的标识符从10更改为15
根据例外,我可以理解它正在尝试更新ManagerEntity中的行,即子表,但我不想在ManagerEntity中进行任何更新,只应将任何现有的ManagerEntity重新分配给CustomerEntity。
我尝试在CustomerEntity中提供CascadeType.MERGE或CascadeType.DETACH,但它不起作用。
任何人都可以建议我更新CustomerEntity实体的正确方法,即父级而不更新ManagerEntity,即子实体
答案 0 :(得分:0)
我建议你做一个保存更新级联
将您的孩子关联为保存更新级联
获取父
更新子实体
执行saveOrUpdate
我建议你传递经理的id作为单独的参数更新
public void updateManager(Customer customer , Long managerId) throws Exception {
//Below code will fetch the customer you need to update
CustomerEntity customerEntity = customerDao.find(customer.getId());
ManagerEntity managerEntity = new ManagerEntity();
managerEntity.setId(managerId);
customerEntity.setManager(managerEntity);
getSession().saveOrUpdate(customerEntity);
}
答案 1 :(得分:0)
我做了一点测试,并用这段代码得到了同样的例外:
void setManager(ManagerEntity managerEntity) {
this.manager.setId(managerEntity.getId());
}
而不是正确的:
void setManager(ManagerEntity managerEntity) {
this.manager = managerEntity;
}