javaee6 的 EntityManager 中有 detach 方法, javaee5 中如何实现.
我使用的是 Hibernate JPA
场景如下:
RepairBill -> RepairBillItem 为一对多关联,我在 RepairBillDao 中手工处理级联操作.
代码如下:
@Override
public RepairBill update(RepairBill entity) throws PersistenceException {
RepairBill otherEntity;
otherEntity = loadByACode(entity.getAccount(), entity.getCode());
if (otherEntity != null && !otherEntity.getId().equals(entity.getId())) {
String message = messages.getString("error.entityExists");
String message0 = messages.getString("entity.repairBill.account");
String message1 = messages.getString("entity.repairBill.code");
throw new EntityExistsException(MessageFormat.format(message, message0 + "&" + message1));
}
RepairBill oldRepairBill = load(entity.getId());
for (RepairBillProcess repairBillProcess : oldRepairBill.getProcesses()) {
if (!entity.getProcesses().contains(repairBillProcess)) {
repairBillProcessDao.delete(repairBillProcess);
}
}
for (RepairBillProcess repairBillProcess : entity.getProcesses()) {
repairBillProcess.setRepairBill(entity);
if (!oldRepairBill.getProcesses().contains(repairBillProcess)) {
repairBillProcess = repairBillProcessDao.create(repairBillProcess);
} else {
repairBillProcess = repairBillProcessDao.update(repairBillProcess);
}
}
for (RepairBillItem repairBillItem : oldRepairBill.getItems()) {
if (!entity.getItems().contains(repairBillItem)) {
repairBillItemDao.delete(repairBillItem);
}
}
for (RepairBillItem repairBillItem : entity.getItems()) {
repairBillItem.setRepairBill(entity);
if (!oldRepairBill.getItems().contains(repairBillItem)) {
repairBillItem = repairBillItemDao.create(repairBillItem);
} else {
repairBillItem = repairBillItemDao.update(repairBillItem);
}
}
return super.update(entity);
}
如果在 RepairBillService 中有如下调用:
repairBill = repairBillDao.load(repairBill.getId());
repairBill.setItems(new ArrayList(repairBillItemMap.values()));
repairBill.setPrepareCheckout(true);
return repairBillDao.update(repairBill);
上面导致问题出现,因为 Dao 中的 RepairBill oldRepairBill = load(entity.getId());所获取的并非当前数据库中数据.
我想到解决方法是GenericDaoImpl中load某entity后立即detach掉.