Как сделать оптимистичную блокировку в hibernate
Я совершенно новичок в Hibernate и Spring, и в моей попытке узнать Spring, Hibernate, Maven и т. д. Я знаю только, как запустить пример hello world, используя все три. С моим базовым пониманием мне была назначена задача для выполнения оптимистической блокировки. Насколько я погуглил, я вижу, что это не очень сложно, все, что мне нужно, это добавить тег версии в мою xml и целочисленную версию переменной в моем сопоставленном классе.. Вроде этого...
public class MyClass {
...
private int version;
...
}
мой xml должен быть похож это
<class name="MyClass">
<id ...>
<version name="version" column="VERSION" access="field">
...
</class>
и hibernate автоматически позаботится о управлении версиями, когда второй пользователь сохраняет, hibernate обнаруживает, что этот пользователь работает над устаревшими данными и бросает StaleObjectException.
просто хотел подтвердить мое понимание, спасибо заранее.
это будет очень полезно, если кто-то может указать мне на пример hello world для этого.
Я также хотел бы упомянуть, что я пытаюсь реализовать сценарий "last commit wins"
2 ответов
я использовал аннотации Hibernate и вот моя реализация оптимистической блокировки
@Entity
public class MyObject {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String data;
@Version
private Integer version; // this is version field
}
вот пример
// Entity class with version field
@Entity
public class Ent1 implements Serializable {
private static final long serialVersionUID = -5580880562659281420L;
@Id
Integer a1;
Integer a2;
@Version
private Integer version;
}
и некоторый код для добавления одного элемента в DB
session = HibernateHelper.getSessionFactory().openSession();
transaction = session.beginTransaction();
Ent1 entity = new Ent1();
entity.setA1(new Integer(0));
entity.setA2(new Integer(1));
session.save(entity);
transaction.commit();
// get saved object and modify it
transaction = session.beginTransaction();
List<Ent1> list = (List<Ent1>)session.createQuery("FROM Ent1 WHERE a1 = 0").list();
Ent1 ent = list.get(0);
ent.setA2(new Integer(1000));
session.save(ent);
transaction.commit();
после создания новый элемент в БД имеет версию 0. После изменения версии 1.
HibernateHelper.java
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class HibernateHelper {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Если мы используем стиль xml, мы можем использовать, как показано ниже в файле hbm:
<id name="productId" column="pid" />
**<version name="v" column="ver" />**
<property name="proName" column="pname" length="10"/>