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掉.