2012-07-09 2 views
1

Exception "org.hibernate.exception.LockAcquisitionException: n'a pas pu insérer" apparaît parfois dans le code suivant:exception Hibernate: impasse

Question questionClone; 
try { 
    questionClone = (Question) question.clone(); 
} catch (CloneNotSupportedException e) { 
    throw WrappedException.wrap(e); 
} 
questionClone.setCategory(question.getCategory()); 
questionClone.setOriginal(false); 
logger.trace("Saving questionClone " + questionClone + " start"); 
hibernateSession.save(questionClone); 
logger.trace("Saving questionClone " + questionClone + " end"); 

lorsque questionClone est enregistré. Voici la méthode clone pour la question:

public Object clone() throws CloneNotSupportedException { 
    Question questionClone = (Question) super.clone(); 

    questionClone.category = null; 

    List<Alternative> alternativesClone = new ArrayList<Alternative>(getInternalAlternatives().size()); 
    int index = 0; 
    for (Iterator<Alternative> iterator = getInternalAlternatives().iterator(); iterator.hasNext();) { 
     Alternative alternative = iterator.next(); 
     Alternative alternativeClone = (Alternative) alternative.clone(); 
     alternativeClone.setQuestion(questionClone); 
     alternativeClone.setIndex(index); 
     alternativesClone.add(alternativeClone); 
     ++index; 
    } 
    questionClone.setInternalAlternatives(alternativesClone); 

    return questionClone; 
} 

et méthode clone pour Alternative:

mapping
public Object clone() throws CloneNotSupportedException { 
    Alternative alternativeClone = (Alternative) super.clone(); 

    alternativeClone.index = 0; 
    alternativeClone.question = null; 

    return alternativeClone; 
} 

Mise en veille prolongée de la question contient ceci:

<list name="internalAlternatives" inverse="true" cascade="all-delete-orphan"> 
    <cache usage="read-write"/> 
    <key column="QUESTION_ID"/> 
    <list-index column="INDEX"/> 
    <one-to-many class="Alternative"/> 
</list> 

Exception indique qu'il ne peut pas insérer une alternative et provoqué par: com.ibm.db2.jcc.am.SqlTransactionRollbackException: Erreur SQL DB2: SQLCODE = -911, SQLSTATE = 40001, SQLERRMC = 2, DRIVER = 4.14.88. Comme je l'ai découvert, c'était une impasse. Quelqu'un peut-il aider avec ceci?

+0

Les questions sont clonées lorsque l'utilisateur démarre le test. Cela peut-il être dû au fait que plusieurs utilisateurs ont commencé le test en même temps? Pour chaque utilisateur, la session de test individuelle est créée. –

Répondre

1
alternativeClone.setQuestion(questionClone); 

et

questionClone.setInternalAlternatives(alternativesClone); 

semble être le dealock se produit becuase de ces lignes. Vous ajoutez la liste sur internalAlternatives à l'intérieur de votre question, puis définissez également question à l'intérieur de alternative.

+0

Merci pour la réponse! Quand je l'ai testé, ça a bien fonctionné sans émettre d'exception. Cependant cette application est déjà utilisée et l'exception est apparue là. Peut-il être la raison pour laquelle plusieurs personnes commencent le test en même temps et l'ensemble des alternatives verrouillé? –