6

現在、HibernateをOracle8Legacy-Databaseで動作させようとしています。これまでのところすべてが正常に機能していますが、まだ克服していない問題が発生しています。データベースのブール値は、「y」/「n」または「t」/「f」または0/1形式で保持されませんが、プロジェクトはスペイン語圏からのものであるため、si/noの場合は「s」/「n」として保存されます。ただし、これは明らかにHibernateではサポートされていません。

何か案は?私は正しい方向へのすべての小さなポインターに感謝します。たとえば、どのクラスがBoolean-Mappingを実行するので、それをオーバーライドしたり、独自のバージョンを作成したりできますか?

前もって感謝します。

4

3 に答える 3

2

AFAIKでは、独自のDialectクラスを使用して、現在使用しているDialectクラスを拡張し、メソッドをオーバーライドする必要がありますtoBooleanValueString()

于 2012-11-23T14:02:29.237 に答える
2

私が知っているもう1つの拡張ポイントは、契約を使用することです

org.hibernate.usertype.UserType

実装する必要のあるより重要なメソッドは、nullSafeSetとnullSafeGetです。これらは、Hibernateがオブジェクトを「ハイドレイト」する前にResultSetからjavaオブジェクトに値を変換するために必要なフックを提供し、その逆も同様です。

例えば

public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
        String value = rs.getString(names[0]);
        if(value==null) {
             //handle this
        }
        //handle other possibilities like Si/No or whatever here
        return "s".equals(value) ? Boolean.TRUE : Boolean.FALSE;
    }

    public void nullSafeSet(PreparedStatement st, Object value, int index) 
    throws HibernateException, SQLException {
        if (value==null) {
            //handle this
            return;
        }
        Boolean bValue = (Boolean) value;
        if(bValue) {
            st.setString("s", index);
        } else {
            st.setString("n", index);
        }
        //handle other possibilities like Si/No or whatever here
    }

次に、UserType実装をHibernateに認識させるだけです。これは、Hibernateマッピングでtypedef要素として実行するか、UserTypeが適用可能なプロパティ要素のtype属性を使用するだけで実行できます。

于 2012-11-23T14:32:13.417 に答える
1

これは、Hibernateでカスタムタイプを定義することによって行う方法です

public class CustomBooleanType extends BooleanType {

   public static final String TRUE = "s";
   public static final String FALSE = "n";

   public CustomBooleanType () {
      super(CharTypeDescriptor.INSTANCE, new BooleanTypeDescriptor(TRUE.charAt(0), FALSE.charAt(0)));
   }  
}
于 2012-11-23T14:39:34.723 に答える