2017-05-17 5 views
0

Ich habe meine DB-Tabellen mit Hibernate erstellt, und meine Benutzerklasse hat eine automatisch generierte ID wie folgt.Wie fügt man eine Zeile in eine vorhandene Autoinkrement-Tabelle in Oracle ein?

Ich versuche, einen Benutzer von der Toad-Konsole einzufügen, auch ich füge den user_id-Wert als manuell hinzu. Wenn ich einen neuen Benutzer aus meiner Anwendung eingefügt werden soll, bekomme ich einen Fehler wie folgt,

java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (TDM.SYS_C001668192) violated 

ich mit einem Verfahren einige Werte aus der Datenbank einfügen müssen, so wie neue Zeilen einfügen mit der bestehenden Sequenz mit oder ID (was auch immer)?

UPDATE:

ich das Problem dank @Afridi wie folgt beheben.

Erstens hinzugefügt I-Sequenz Annotation

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "t_user_id_seq_generator") 
    @SequenceGenerator(name = "t_user_id_seq_generator", sequenceName = "t_user_seq") 
    @Column(name = "user_Id") 
    private int userId; 

nach, dass ich es so user_id genannt;

insert into t_user (user_id, username) values(T_USER_SEQ.nextval, 'newUser'); 

Ich überprüfte es diese sql;

select * from user_sequences where sequence_name = 'T_USER_SEQ'; 
+1

Verwendung dieses: @Id @GeneratedValue (strategy = GenerationType.AUTO, Generator = "my_entity_seq_gen") @SequenceGenerator (name = "my_entity_seq_gen", SequenceName = "MY_ENTITY_SEQ") private Lange id; – Afridi

+0

kann ich sofort auf bereits vorhandenen Wert zugreifen? –

Antwort

0

Ich löse das Problem dank @Afridi wie folgt.

Erstens hinzugefügt I-Sequenz Annotation

@Id 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "t_user_id_seq_generator") 
@SequenceGenerator(name = "t_user_id_seq_generator", sequenceName = "t_user_seq") 
@Column(name = "user_Id") 
private int userId; 

nach, dass ich es so user_id genannt;

insert into t_user (user_id, username) values(T_USER_SEQ.nextval, 'newUser'); 

Ich überprüfte es diese sql;

select * from user_sequences where sequence_name = 'T_USER_SEQ'; 
1

Hibernate füllt Spaltenmarkierungen automatisch mit @GeneratedValue. Doc:

Die @GeneratedValue Annotation festgelegt, dass die Einheits-Identifikation Wert automatisch eine Identitätsspalte erzeugt wird, unter Verwendung einer Datenbank Sequenz oder einen Tabellengenerator. Hibernate unterstützt das @GeneratedValue -Mapping auch für UUID-Bezeichner.

Sie können den Typ @GeneratedValue einstellen. Siehe https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators

1

Dies hat nichts mit @GeneratedValue Annotation zu tun. Selbst wenn Sie Ihr Feld mit dieser Anmerkung versehen haben und Ihre eigene ID angeben, wird diese verwendet, anstatt sie zu generieren.

Sie erhalten diesen Fehler wegen @Id Annotation. Diese Anmerkung macht Ihr Feld userId einzigartig. Es ist ein Primärschlüssel, so dass Sie keine doppelten Einträge haben können.

Sie können statt session.save(entity)session.update(entity) oder session.saveOrUpdate(entity) aufrufen. Es wird entweder gespeichert, wenn es nicht existiert, ansonsten wird es aktualisiert/überschrieben.

+0

Sie haben Recht, aber ich versuche nicht, etwas zu aktualisieren, ich versuche, einige Werte aus einer anderen Datenbank in meine eigene Datenbank mit JDBC zu verschieben, aber meine aktuellen Werte wurden mit einer Prozedur erstellt. nicht mit meiner Bewerbung. Daher tritt ein Problem für doppelte IDs auf. Ich habs? –

1

Hibernate verwenden eine Sequenz, um IDs für @GeneratedValue Feld zu generieren, und Hibernate wird einige IDs zwischenspeichern, die aus dieser Sequenz ausgewählt ist. Wenn Sie also die ID für die neue Zeile manuell zuweisen, kann diese ID die zwischengespeicherte ID verletzen.

Verwandte Themen