Implementieren der optimistischen Sperre mit Hibernate und Spring

Ich versuche, Optimistic Locking zu implementieren, um eine verlorene Aktualisierungssituation zu vermeiden. In meiner Anwendung, wenn zwei Benutzer denselben Datensatz abrufen und der erste Benutzer ihn mit einigen Änderungen aktualisiert. Diese Änderung ist für den zweiten Benutzer, der denselben Datensatz anzeigt, nicht sichtbar. Er nimmt einige Änderungen selbst vor und aktualisiert sie. Dadurch geht der erste Personenwechsel verloren. Um dies zu verhindern, habe ich folgendes geschrieben, aber das Problem bleibt bestehen. Ich bin neu in diesem Konzept, nicht in der Lage, das Problem zu identifizieren.

Ich habe versucht, dies durch Lesen zu erreichendoc 11.3.4. Abschnitt zur automatischen Versionierung anpassen.

Die Konfigurationsdatei

<?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>

Entitätsklasse

@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
}

DAO Impl

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();
    }
}

Danke im Voraus

Antworten auf die Frage(1)

Ihre Antwort auf die Frage