JPA GenerationType.AUTO pas tenu compte de la colonne avec l'auto-incrément

J'ai une table avec un simple int colonne id de l'Identité incrément automatique dans SQL Server.

L'entité Id est annoté avec @Id et @GeneratedValue

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", length = 4, precision = 10, nullable = false)
private Integer id;

Dans SQL Server la colonne est correctement défini comme Identité avec Seed et Increment est égal à 1.

Quand j'ai essayez de conserver une instance de cette entité, Hibernate tente d'interroger la hibernate_sequence table pour obtenir la valeur de l'ID. Depuis je n'ai pas créé cette table dans mon schéma j'obtiens une erreur:

could not read a hi value: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'MySchema.hibernate_sequence'

Si je change le type de génération de l'IDENTITÉ tout fonctionne comme prévu

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", length = 4, precision = 10, nullable = false)
private Integer id;

Je ne peux pas changer de cette façon, depuis mon Application va fonctionner à la fois sur MS SQL et ORACLE, et ce dernier ne prend pas en charge l'auto incrémenté colonnes.

Autant que je sache, l'AUTO type d'utiliser l'auto incrément de comportement si le sous-jacent de la base de données a l'appui de cela, donc je ne sais pas pourquoi il ne fonctionne pas.

Mise à JOUR:

Il m'a fallu un certain temps, mais j'ai été en mesure de comprendre exactement ce qui se passe.

Je suis en train de travailler avec des bases de données existantes avec les comportements suivants:

  • MSSQL: génération de code utilise le tableau de l'IDENTITÉ
  • ORACLE: id de génération utilise un déclencheur. Le déclenchement des requêtes et mises à jour une table personnalisée où tous les "à côté id" sont stockés. Ce tableau est appelé SEQ.

Ici est le résultat de l'utilisation de certaines stratégies de génération d'identifiant:

  • AUTO: ne fonctionne pas dans MSSQL, comme expliqué ci-dessus
  • IDENTITÉ: les travaux MSSQL, mais n'est pas pris en charge par Oracle
  • "native": les travaux en MSSQL, mais échoue dans ORACLE. Il échoue parce que Hibernate active par défaut de la séquence de la stratégie, qui utilise hibernate_sequences.nextval. Puisque c'est un héritage de l'application des valeurs de la SEQ tableau (mentionné ci-dessus) et la hibernate_sequences ne sont pas synchronisés (SEQ valeur de cette table est à 6120, et hibernate_sequences " est à 1, ce qui est normal puisque il n'a pas été utilisé jusqu'à présent).

Donc ce que j'ai besoin de trouver un moyen de le configurer de cette entité:

  • Utilisation MSSQL Identité fonctionnalité
    OU
  • Lors de l'utilisation d'Oracle, n'a pas automatiquement régler une valeur à la variable ID et de laisser toute la place à la pré-existant déclencher

Cela peut me causer de graves problèmes sur Oracle lorsque j'ai besoin d'insérer des entités qui dépendent de l'entité principale (via clé étrangère), parce que Hibernate n'en connais pas la valeur de l'ID qui a été généré par le "externe" déclencheur.

OriginalL'auteur pipo_dev | 2014-07-30