JPA: tout exemple complet d'utilisation de @Version pour empêcher simultanée des modifications pour le même enregistrement?

J'ai une classe qui a le champ suivant:

@Version
private Long version = 1L;

public Long getVersion() {
    return version;
}

public void setVersion(Long version) {
    this.version = version;
}

- Je utiliser web Spring + Hibernate. J'espère voir un relativement complet exemple d'utilisation de @Version pour empêcher simultanée des modifications du même enregistrement.

Cherché et cherché SI. Pas réussi à en trouver. J'ai utilisé un caché HTML champ de formulaire pour la version de champ et il ne fonctionne pas.

Toute info/pointeur est vraiment apprécié.

Merci et salutations!

Mise à jour de 1

Voici ce que j'ai fait. J'ai chargé le même enregistrement dans deux fenêtres de navigateur. J'ai pu voir qu'il y avait un caché champ version avec la même valeur dans le formulaire HTML de windows. J'ai soumis le formulaire dans une fenêtre et vérifié la base de données et d'avis que le champ Version a été augmenté. Ensuite, j'ai présenté une autre fenêtre. Rien ne s'est passé et que le dossier a été mis à jour/enregistré avec succès. Je m'attendais à quelque sorte d'exception a été levée.

Dois-je configurer le spring/hibernate combinaison pour le faire fonctionner, en plus de la Version de définition de champ?

Mise à jour 2

Je ne le suit à la trace comment Hibernate mise à jour du dossier:

hibernate.show_sql=true

log4j.logger.org.hibernate.type=trace

Maintenant, je suis en mesure de voir comment Hibernate mise à jour de l'enregistrement. Je remarque qu'au moment de l'Hibernation de la mise à jour du dossier avec le SQL suivant

update ... where id=? and version=?

Hibernate utilise toujours le dernier numéro de version de la base de données à lier, même si je peux confirmer que dans la couche web un record toujours a l'ancienne numéro de version, en plus d'autres champs de données nouvelles, avant d'enregistrer l'enregistrement.

Comment venir?

Je me sens optimiste, le verrouillage est désactivé en quelque sorte dans mon application, mais je ne fais pas Hibernate config pour ce. Je suis de l'utilisation d'Hibernate 4.2.1.Final et le Printemps 3.2.2.La LIBÉRATION.

Est-il un moyen explicite pour activer/désactiver la veille prolongée verrouillage optimiste?

Mise à jour 3

Voici les objets de données et la couche de base de données de code. "friendGroupDao" est auto-câblé dans le transactionnel de la couche de service où cet objet DAO est appelée pour charger un objet de la couche web et les enregistre un objet de la base de données. Le service connexe de la couche de méthodes d'appeler tout simplement la friendGroupDao.load() et friendGroupDao.save() sans aucun code supplémentaire.

-------------- des objets du domaine -------------

@MappedSuperclass
public abstract class BaseObject implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Version
private Long version = 1L;
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}   
public BaseObject() {
}
}
@Entity
public class FriendGroup extends BaseObject {
@Column(columnDefinition = "NVARCHAR(120)")
private String name;
public String getName() {
return name;
}
public void setName(String accountName) {
this.name = accountName;
}   
}
--------------- database -------------
public interface BaseObjectDao<T extends BaseObject> {
void delete(T o);
T load(Long id);
void save(T o);
}
public class BaseObjectDaoImpl<T extends BaseObject> implements
BaseObjectDao<T> {
private Class<T> domainClass;
@Autowired
protected SessionFactory sessionFactory;
public BaseObjectDaoImpl() {
this.domainClass = (Class<T>) BaseObject.class;
}
public BaseObjectDaoImpl(Class<T> domainClass) {
this.domainClass = domainClass;
}
public SessionFactory getSessFactory() {
return sessionFactory;
}
public void setSessFactory(SessionFactory sf) {
this.sessionFactory = sf;
}
public void delete(T object) {
getSession().delete(object);
}
public T load(Long id) {
return (T) getSession().get(domainClass, id);
}
public void save(T object) {    
getSession().saveOrUpdate(object);
}
public Session getSession() {
return sessionFactory.getCurrentSession();
}
}
public interface FriendGroupDao extends BaseObjectDao<FriendGroup> {
}
@Repository("friendGroupDao")
public class FriendGroupDaoImpl extends BaseObjectDaoImpl<FriendGroup> implements
FriendGroupDao {
public FriendGroupDaoImpl() {
super(FriendGroup.class);
}
}
  • Que voulez vous dire par "Il n'est pas de travail"? Qu'attendez-vous, et ce qui se passe?
  • Il y a quelques questions / réponses appartenant à la @Version Annotation. Par exemple stackoverflow.com/questions/1838646/jpa-version-how-to-use-it ou stackoverflow.com/questions/2572566/java-jpa-version-annotation
  • andih, j'ai lu le premier post avant mon post. Le deuxième poste est utile. Il pourrait être la raison pourquoi j'ai fait ce post. Je ne suis pas sûr de savoir comment il fonctionne.
  • Optimiste de verrouillage est activée par défaut. Il y a sûrement une exception qui est levée, mais peut-être pas connecté. Vous pouvez exécuter cette opération avec votre débogueur pour voir ce qui se passe. Essayez également de l'impression de toutes les requêtes SQL qui sont envoyés par la mise en veille prolongée (hibernate.show_sql = true).
  • En prime, j'ai suivi votre suggestion. Encore mystérieux résultats. Voir mon post mis à jour. Merci!
  • Combien d' (Hibernate) des Séances d'information et les Transactions sont impliqués dans la lecture / mise à jour de vos dossiers? Quelle méthode utilisez-vous pour la mise à jour de l'entité? Pouvez-vous poster le code qui lit / met à jour les entités?
  • andih, merci beaucoup pour m'aider à résoudre ce! J'ai été frappé par votre question "Combien d' (Hibernate) des Séances d'information et les Transactions sont impliqués dans la lecture / mise à jour de vos dossiers?" Je pense que vous êtes sur quelque chose. Je n'ai debug moi-même. Lors des observations "getSession().saveOrUpdate(objet);" dans l'enregistrer(T objet), je suis encore capable d'enregistrer un objet de la base de données. Je ne peux pas comprendre pourquoi.

InformationsquelleAutor curious1 | 2013-06-21