天天看点

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