1

Hibernate を使用してオブジェクトをデータベースに保存すると、オブジェクト内の特定のフィールドがvarcharデータベースで定義されている最大長を超えているために失敗することがあります。

したがって、私は次のアプローチを使用しています。

  1. 保存しようとする
  2. を取得した場合DataExceptionは、オブジェクト内のフィールドをデータベース定義で指定された最大長に切り詰めてから、再度保存を試みます。

ただし、切り捨て後の 2 回目の保存では、次の例外が発生します。

hibernate: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails

関連するコードは次のとおりです。何か問題があることに気づきましたか?

public static void saveLenientObject(Object obj){

    try {
        save2(rec);
    } catch (org.hibernate.exception.DataException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();


        saveLenientObject(rec, e);



    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }



}
private static void saveLenientObject(Object rec, DataException e) {
    Util.truncateObject(rec);
    System.out.println("after truncation ");
    save2(rec);

}
public static void save2(Object obj) throws Exception{
    try{
        beginTransaction();
        getSession().save(obj);

        commitTransaction();

    }catch(Exception e){
        e.printStackTrace();
        rollbackTransaction();
        //closeSession();
        throw e;
    }finally{
        closeSession(); 
    }
}    
4

2 に答える 2

1

すべての Hibernate 例外 (を除くNonUniqueResultException) は回復不能です。例外が発生した場合は、セッションを閉じて、さらに操作を行うために別のセッションを開く必要があります。

以下も参照してください。

于 2012-09-16T09:48:51.590 に答える
0

休止状態のドキュメントは、例外がスローされるとセッションが一貫性のない状態のままになるため、それ以上の操作に安全に使用できないことを明確に示しています。あなたがここで得ているのは、最初の試行を保存してセッションが半分残っているため、悪いことが起こっているということだと思います.

基本的に、データベース エラーに頼ってフィールドの長さをチェックするべきではありません。代わりに、これを Java コードで事前に検証する必要があります。切り詰めるのに十分な長さがわかっている場合は、毎回 Trucate util を呼び出すことをお勧めします。

または、 Hibernate Validatorを使用して、保存する前にオブジェクトを宣言的に検証します。

于 2012-09-16T09:52:26.797 に答える