天天看點

java detach_javaee5 中如何 detach 某個 entity 或 有其它解決方案.

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