2010-10-02 14 views
0

J'ai 2 tables nommées T1 et T2. Où T1 est parent et T2 est enfant. Le scénario est, j'ai commencé une transaction jdbc, puis insérez une ligne dans T1, puis essayez d'insérer une ligne dans T2. Insérer une ligne dans T2 me donne l'exception "Integrity Constraint-Parent key not found".Comment gérer les contraintes de la clé parent dans les transactions jdbc?

Comment je gère ce scénario?

Connection con; 
try{ 
    con = ConnectionPool.getConnection(); 
    con.setAutoCommit(false); 
    int T1Id = getNewId("T1"); // from sequence; 
    int T2Id = getNewId("T2"); // from sequence; 
    Insert in to table T1(t1Id,tName) values (T1Id,'A') 
    Insert in to table T2(t2Id, t1Id,tName) values (T2Id,T1Id,'A')//Here, Exception raises 

    con.commit(); 

}catch(Exception e){ 
    try {con.rollback();} catch (SQLException e) {} 

}finally{ 
    try {con.setAutoCommit(true);} catch (SQLException e) {} 
    ConnectionPool.returnConnection(con); 
} 

Utilisation de l'API JDBC, struts1.2, Oracle10 G Database

+2

vous devriez montrer votre ** code JDBC ** actuel. Pas un code pseudo-SQL. –

+0

Pas de code Java réel. Je vais voter pour fermer ceci. – duffymo

Répondre

1

Vous faites probablement quelque chose de mal. Si les deux insertions sont dans la même transaction, ce que vous venez de mentionner ne peut pas arriver. S'il vous plaît partager du code et plus d'informations (serveur de base de données, structures de table) pour voir si nous pouvons vous aider.

+0

avez-vous compris ma question? – Zeeshan

+2

Oui, je l'ai fait. Et je vous dis que cela ne peut pas arriver si vous faites les deux insertions dans la même transaction. Nous avons encore besoin de plus d'informations pour vous aider. –

+0

Mon ami, maintenant voici le code réel – Zeeshan

0

Vous avez besoin d'un processus en trois étapes:

  1. ligne d'insertion dans parent
  2. Sélectionnez la clé générée à partir du parent
  3. Utilisez la clé générée et l'information enfant à insérer dans l'enfant

Il devrait s'agir d'une seule unité de travail, alors rendez-la transactionnelle.

Il est impossible de dire à partir de votre pseudo code. Il serait également utile de savoir si vous utilisez des clés générées automatiquement.

Je suppose que la clé primaire que vous supposez pour T1 n'apparaît pas réellement. Si T2 indique que la clé étrangère ne peut pas être nulle ou requise et qu'elle n'apparaît pas dans T1, le système RDBMS doit alors se plaindre et émettre une exception.

+0

Je suis en train de faire les étapes 1 et 3. Passer l'étape 2 parce que j'ai déjà un identifiant nouvellement généré, obtenu à partir de la séquence. Les 3 étapes sont déjà dans une transaction. – Zeeshan

+0

"Je suppose que la clé primaire que vous supposez pour T1 n'apparaît pas réellement Si T2 indique que la clé étrangère ne peut pas être nulle ou requise, et qu'elle n'apparaît pas dans T1, le système RDBMS doit se plaindre et lancer une exception." Oui c'est le scénario, la clé primaire pour T1 n'apparaît pas en raison de la transaction. – Zeeshan

+0

Vous devez soit générer une clé que vous pouvez INSERT dans les deux OU faire l'équivalent d'un flush sans valider. – duffymo