2011-09-15 10 views
0

フォームの回答とHTMLテンプレートを格納する2つのテーブルがあります。テーブル回答には、html_templatesテーブルの主キーを参照する外部キーwhihがあります。回答テーブルにレコードを追加しようとすると問題が発生します。レコードは保存されていませんが、データベース内の自動インクリメントIDはインクリメントされました。

//session opened 
    Answers answers = new Answers(); 
    answers.setAnswer("answer..."); 
    //there is a record in getHtmlTemplates with 4 as an id 
    answers.setHtmlTemplates(getHtmlTemplates(4)); 
    session.save(answers); 

プログラムはwarringsなしで実行されますが、DB(MySql)にはレコードはありません。 answersにレコードを手動で追加するとき、IDは複数増加します。実際には、すべての操作がトランザクション内にある場合、レコードが追加されます。何が起こった? DBデータベースがこのレコードを削除したようです。

答えて

3

トランザクションをコミットしていない可能性があります。 MySQLのような自動インクリメントカラムの場合、saveメソッドはダミーレコードを挿入して、Hibernateが新しいID値を取得できるようにします(新しいIDであるsaveがオブジェクトを返すことに注意してください)。 MySQLはその値を使用済みとしてマークしました。そのため、手動で挿入するとIDが「飛び越えた」ように見えます。

+0

おそらく正しいでしょう。しかし、私は取引を開始することさえできない状況を抱えていました。私はセッションを開いて、新しいオブジェクトをセッションに保存した後、session.flush()を呼び出しました。うまくいきませんでした。私がトランザクションを使用したときに言ったように、すべての作品は、私はトランザクションを開始する必要がありますか?これは外部キーのないテーブルでこのように動作するため、複数のSQLクエリを実行する(データベースからオブジェクトから主キーを取得する)ときに、トランザクションを開始(コミット)する必要があります。 – Damian

+0

Hibernateはトランザクション内のすべてを行います。上記の例では、トランザクションは暗黙的に開始されますが、決してコミットしないため、データはありません。 – Mac

関連する問題