Se dupliquer les erreurs de saisie de Hibernate, MySQL est à blâmer?

Je suis en train de travailler sur une application de base de données qui est principalement en lecture seule, mais il y a une table qui enregistre les mouvements de l'utilisateur dans l'application et a un grand nombre d'écritures. Pour tous les quelques milliers d'écritures, nous voyons quelques exceptions près, dans le journal des erreurs de la sorte:

[WARN][2009-07-30 11:09:20,083][org.hibernate.util.JDBCExceptionReporter] SQL Error: 1062, SQLState: 23000
[ERROR][2009-07-30 11:09:20,083][org.hibernate.util.JDBCExceptionReporter] Duplicate entry '17011' for key 1
[ERROR][2009-07-30 11:09:20,083][org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
  at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
  at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
  at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)

La table en question a le schéma suivant:

CREATE TABLE IF NOT EXISTS `my_table` (
  `id` int(11) NOT NULL,
  `data1` int(11) NOT NULL,
  `data2` int(11) NOT NULL,
  `timestamp` datetime default NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Et le correspondant Hibernate mapping XML:

<hibernate-mapping>
  <class name="mycorp.MyClass" table="my_table">
    <id name="id" column="id" type="java.lang.Integer">
      <generator class="increment"/>
    </id>
    <property name="data1" column="data1" type="java.lang.Integer"/>
    <property name="data2" column="data2" type="java.lang.Integer"/>
    <property name="timestamp" column="timestamp" type="java.util.Date"/>
  </class>
</hibernate-mapping>

Il est possible, quoique peu probable, que plusieurs instances de notre application qui pourrait être écrit à la base de données à la fois, depuis que nous avons des numéros de version dans notre webapp contexte transparente de sortir de nouvelles versions des applications. Les Clients avec l'ancienne version de l'application mis en cache dans le navigateur web serait ainsi d'accéder aux anciennes versions du serveur, qui nous annulez après quelques semaines.

De toute façon, je ne suis pas convaincu que ce soit le problème, mais je suspecte qu'il y a quelque problème de synchronisation entre MySQL et Hibernate à portée de main ici. Le fait de modifier mon générateur de séquence, seqhilo ou hilo de l'aide? Aussi, si vous pouvez fournir un exemple de mise en place d'un générateur de MySQL, qui seraient très utiles, comme la plupart des ressources en ligne sont tout simplement copier-collé de la cruellement aux normes d'exemples dans les Hibernate manuel.

OriginalL'auteur Nik Reiman | 2009-07-30