Сохранить и обновить объект в той же транзакции - PullRequest
0 голосов
/ 05 декабря 2011

мое требование - сохранить объект и после сохранения 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? Я в замешательстве.

пожалуйста, посоветуйте, спасибо.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

исправили это, изменив метод save dao для возврата сохраненного объекта (с сгенерированным идентификатором):

public Employee addEmployee(Employee employee) {
            employee = (Employee) getCurrentSession().merge(employee);
            getCurrentSession().save(employee);
            return employee;
        }

и в сервисе:

            employee=employeeDao.addEmployee(employee); // to get the generated identifier

            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);
0 голосов
/ 05 декабря 2011

Я думаю, вам следует попытаться использовать аннотацию @Transactional на вашем Dao.

...