Oracle
 sql >> Base de données >  >> RDS >> Oracle

Hiberner, id, oracle, séquence

J'avais aussi un projet où une base de données Oracle qui fournit les données à mes classes @Entity. Comme vous l'avez dit, une séquence génère l'identifiant du PK de la table via un déclencheur. Voici les annotations que j'ai utilisées dans l'une de ces classes :

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "G1")
@SequenceGenerator(name = "G1", sequenceName = "LOG_SEQ")
@Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
public int getId() {
    return this.id;
}

C'est la deuxième syntaxe que vous avez montrée dans votre message. Il n'y a pas d'appel au déclencheur dans le code Java car le déclencheur est géré par la base de données. Je me souviens que je devais avoir la séquence et le déclencheur en même temps dans la BD si je ne voulais pas avoir de problèmes. Le trigger demande si l'id de la ligne à insérer est null ou =0. Dans ce cas la séquence LOG_SEQ est appelée.

Donc, si vous fournissez une valeur au @Id de votre entité, elle pourrait être insérée dans la base de données (si cet identifiant n'existe pas) et la séquence ne serait pas appelée. Essayez de voir le code du déclencheur pour voir exactement ce qu'il se passe.