мое требование - сохранить объект и после сохранения it обновить этот объект с другими связанными данными (все в той же транзакции , поскольку я использую аннотацию @ Transcational для уровень класса обслуживания ), вот фрагмент кода:
Услуги:
@Service@Transactional
public class MyService {
public Employee addEmployee(Employee employee) throws Exception, {
try {
employeeDao.addEmployee(employee);
MessagingGroup messagingGroup = messageGroupDao.getMsgGroupByID(1);
EmployeeGroup employeeGroup = new EmployeeGroup();
employeeGroup.setEmployee(employee); // the saved employee
employeeGroup.setMessageGroup(messagingGroup);
employeeGroup.setJoinType(false);
Set < EmployeeGroup > employeeGroups = new HashSet < EmployeeGroup > ();
employeeGroups.add(employeeGroup);
employee.setEmployeeGroups(employeeGroups);
updateEmployee(employee);
return employee;
} catch (AccessDeniedException ad) {
throw new AccessDeniedException("Access Denied!");
} catch (Exception e) {
log.error("Error Occurred While Adding Employee: " + e.getMessage());
e.printStackTrace();
return null;
}
}
}
DAO:
public class MyDao {
public void addEmployee(Employee employee) {
employee = (Employee) getCurrentSession().merge(employee);
getCurrentSession().save(employee);
}
public void updateEmployee(Employee employee) {
getCurrentSession().update(employee);
}
}
Проблема:
В сервисе, после сохранения объекта и попытки обновления, я обнаружил, что идентификатор сохраненного объекта равен 0, поэтому предполагается, что он не сохранен (я так думаю, поскольку транзакция еще не была зафиксирована до обновления, так как оба Сохранение и обновление выполняются в одной транзакции), поэтому он пытается вставить его снова, так как лучше всего избежать этого, объединить и сохранить все сразу? Или сделать добавление и обновление в отдельных транзакциях, или использовать метод saveOrUpdate
? Я в замешательстве.
пожалуйста, посоветуйте, спасибо.