2016-06-30 5 views
0

私は春のプロジェクトで働いています。ここで私は休止3.5.5-Finalを使用し、データベースはMySQLです。私のコードは、これは私にcreateSQLQuery(sql).executeUpdate()を使用してsql form spring hibernateでデータを挿入できません。

更新最近販売された製品のような出力が得られ怒鳴る

String sql = "INSERT INTO recently_sold_products (product_id, sell_time) VALUES ('9749', '2016-06-01 00:00:00')"; 
    Query query = getCurrentSession().createSQLQuery(sql); 
    System.out.println("Updating recently sold products. Row = " + query.executeUpdate()); 

です。行= 1

しかし、私はデータベーステーブルをチェックすると、私は行が見つかりませんでした。

この表では、product_idは主キーです。重複したproduct_idを挿入しようとすると、エラーメッセージが表示されます。重複するエントリ '9749'がキー 'PRIMARY'になります。これにより、クエリがデータベースに到達することが確認されます。しかし、通常の行を挿入しようとすると、executeUpdate()メソッドの出力は1ですが、テーブルに行が挿入されません。

私は何が起こるか理解できません。

+3

あなたのコードが 'commit'をしないように見えます – Jens

+0

単純なクエリではなく、セッション、トランザクション、オブジェクトを使用するようにクエリを変更することをお勧めします。さもなければ、session.getTransaction()。commit()のような何かをしようとしているはずです。ここで、sessionは現在のセッションです。 getCurrentSession()はここで動作します。 –

+0

最後に問題は解決しました。メソッドの前に@Transactionalを使うだけです。 –

答えて

0

の挿入文の後にコミット送信してください

1

すべてが細かいようだが、問題は、ロールバックです。私はそれについては、あなたがより慎重にあなたのセッションおよびトランザクションを制御する必要があるように思わ休止状態を知っているなけなしから

connection.commit(); //Whatever you are using as con. string. 
+0

接続オブジェクトはどこにありますか? –

0

executeUpdate;した後は、これを追加します。

一部のライブラリまたはデータベース構成では、データをコミットすることなくセッション内で複数のクエリを実行でき、将来のセッションで変更が反映されるようになります。何が起きているのですか?セッション内のデータを変更していますが、セッションを終了してデータをロールバックして、他のセッションはそれを見ることができません。

セッションを開き、トランザクション(またはクエリ)を開始し、セッションをコミットしてセッションを終了します。

これはやりたいことです。セッションを作成せずに変数として保存する場合は、クエリーの後にgetCurrentSession()。getTransaction()。commit()を使用する必要があります。これを行う必要がありますが、これを行うことでセッションを非常にうまく制御できません。背後の何かが正しい順序で起こらないと、奇妙なエラーが発生します。

関連する問題