ManagerEntity实例的标识符已更改

时间:2017-01-23 11:15:35

标签: java hibernate many-to-one

根据我的要求,我在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,即子实体

2 个答案:

答案 0 :(得分:0)

我建议你做一个保存更新级联

  1. 将您的孩子关联为保存更新级联

  2. 获取父

  3. 更新子实体

  4. 执行saveOrUpdate

  5. 参考: - http://javaforloop.com/hibernate/hibernate-cascade-inverse-example-none-save-update-delete-delete-orphan/

    我建议你传递经理的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;
}