Реализация оптимистической блокировки с использованием Hibernate и Spring

Я пытаюсь реализовать Оптимистическую блокировку, чтобы избежать потерянной ситуации обновления. В моем приложении, когда два пользователя выбирают одну и ту же запись, а первый пользователь обновляет ее с некоторыми изменениями. Это изменение невидимо для второго пользователя, который просматривает ту же запись, и он сам вносит некоторые изменения и обновляет их. Из-за чего первые лица меняются, теряется. Чтобы предотвратить это, я написал следующее, но проблема остается. Я новичок в этой концепции, не в состоянии определить проблему.

Я пытался достичь этого, читаядоктор 11.3.4. Настройка раздела автоматического управления версиями.

Файл конфигурации

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<tx:annotation-driven transaction-manager="txManager"/>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="annotatedClasses">
    <list>
        <value>server.bo.Dept</value>
        <value>server.bo.Emp</value>
    </list>
  </property>
  <property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</prop>
        <prop key="hibernate.show_sql">false</prop>
    </props>
  </property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"/>
  <property name="url" value="${db.url}"/>
  <property name="username" value="${db.username}"/>
  <property name="password" value="${db.password}"/>
</bean>
<bean id="deptDAO" class="server.dao.DeptDAOImpl">
  <property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
</beans>

Класс сущности

@Entity
@Table(name = "Dept")
@org.hibernate.annotations.Entity(dynamicUpdate = true,optimisticLock = OptimisticLockType.ALL)
public class Dept{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    Long id;

    @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER, mappedBy = "deptId")
    @Fetch(FetchMode.SELECT)
    @OrderBy(value = "id DESC")
    List<Emp> Emplist;

    public Dept() {}
    // Getters and setters
}

ДАО Импл

public class DeptDAOImpl extends HibernateDaoSupport implements DeptDAO {
    @Transactional(readOnly = true, propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ)
    public Dept getDeptById(Long id) {
            Object param[] = new Object[]{id};
            String  query = "select d from Dept d where d.id=? and d.deleted='0'";
            List<Dept> deptDetailsList = getHibernateTemplate().find(query,param);
            Dept deptDetails = null;
            if(deptDetailsList !=null && deptDetailsList .size()>0)
                deptDetails = (Dept)deptDetailsList.get(0);
            return deptDetails ;
    }

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ)
    public long updateDept(Dept dept) {
            if (dept.getId() == null) { 
                getSession().save(dept);
            } else {
                getSession().update(dept);
            }
            if (dept.getEmplist() != null) {
                    final int size = dept.getEmplist().size();
                    for (int i = size - 1; i >= 0; i--) { 
                        Emp emp = dept.getEmplist().get(i);
                        if (emp.getDeptId() == null) {
                            emp.setDeptId(dept.getId());
                    }
                    if (RecordStatus.NEW.equals(emp.getRecordStatus())) {
                        getSession().save(emp);
                    } else if (RecordStatus.DELETED.equals(emp.getRecordStatus())) {
                        getSession().delete(emp);
                    } else if (RecordStatus.MODIFIED.equals(emp.getRecordStatus())) {
                        getSession().update(emp);
                    }
                }
        }
        return dept.getId();
    }
}

заранее спасибо

Ответы на вопрос(1)

Ваш ответ на вопрос