フォームの回答と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データベースがこのレコードを削除したようです。
おそらく正しいでしょう。しかし、私は取引を開始することさえできない状況を抱えていました。私はセッションを開いて、新しいオブジェクトをセッションに保存した後、session.flush()を呼び出しました。うまくいきませんでした。私がトランザクションを使用したときに言ったように、すべての作品は、私はトランザクションを開始する必要がありますか?これは外部キーのないテーブルでこのように動作するため、複数のSQLクエリを実行する(データベースからオブジェクトから主キーを取得する)ときに、トランザクションを開始(コミット)する必要があります。 – Damian
Hibernateはトランザクション内のすべてを行います。上記の例では、トランザクションは暗黙的に開始されますが、決してコミットしないため、データはありません。 – Mac