2009-03-23 20 views
2

私はいくつかの表をモデル化するためにHibernateのJPA implを使用しています。Jpaコンポジットキーのnull可能な列

  • が、私はそれをハックして定義しようとしました

NULL可能できる3そのうち4列、上で一意のインデックスを持ってい

  • 主キーがない:私はそれをテーブルにマッピングするトラブルを抱えていますコンポジットIDとしてのインデックスですが、いくつかのカラムがヌル可能なので、これは正しく動作しません。これはJPA/Hibernateで可能ですか?

    ありがとうございます。

    答えて

    1

    作業arroundは...あなた自身のUserType実装を実装し、null値を処理して、このための代表的なオブジェクトを返す必要があります。

    私の例を見てください。 Javaので...

    <key-property name="fieldName" type="mypackage.forUserTypes.DefaultLongType"> 
        <column name="FIELD_NAME" precision="10" scale="0" /> 
        </key-property> 
    

    はHBMファイルで次のようになります。私の実装があるので、フィールドは、NULL可能数値である

    public class DefaultLongType implements UserType { 
    private static final long serialVersionUID = 1L; 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#assemble(java.io.Serializable, java.lang.Object) 
    */ 
    public Object assemble(Serializable cached, Object owner) 
         throws HibernateException { 
        return null; 
    } 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#deepCopy(java.lang.Object) 
    */ 
    public Object deepCopy(Object value) throws HibernateException { 
        return null; 
    } 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#disassemble(java.lang.Object) 
    */ 
    public Serializable disassemble(Object value) throws HibernateException { 
        return null; 
    } 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#equals(java.lang.Object, java.lang.Object) 
    */ 
    public boolean equals(Object x, Object y) throws HibernateException { 
        if (x == y) return true; 
        if (x == null) return false; 
        return x.equals(y); 
    } 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#hashCode(java.lang.Object) 
    */ 
    public int hashCode(Object x) throws HibernateException { 
        return x == null ? 0 : x.hashCode(); 
    } 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#isMutable() 
    */ 
    public boolean isMutable() { 
        return false; 
    } 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet, java.lang.String[], java.lang.Object) 
    */ 
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) 
         throws HibernateException, SQLException { 
        final long value = rs.getLong(names[0]); 
        if (rs.wasNull()) { 
         return new Long(Long.MIN_VALUE); 
        } 
        return new Long(value); 
    } 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#nullSafeSet(java.sql.PreparedStatement, java.lang.Object, int) 
    */ 
    public void nullSafeSet(PreparedStatement st, Object value, int index) 
         throws HibernateException, SQLException { 
        Long l = (Long) value; 
        if (l == null || l.longValue() == Long.MIN_VALUE) { 
         st.setNull(index, Types.NUMERIC); 
        } 
        else { 
         st.setLong(index, l.longValue()); 
        } 
    } 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#replace(java.lang.Object, java.lang.Object, java.lang.Object) 
    */ 
    public Object replace(Object original, Object target, Object owner) 
         throws HibernateException { 
        return original; 
    } 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#returnedClass() 
    */ 
    public Class returnedClass() { 
        return Long.class; 
    } 
    
    /* (non-Javadoc) 
    * @see org.hibernate.usertype.UserType#sqlTypes() 
    */ 
    public int[] sqlTypes() { 
        final int[] args = { Types.NUMERIC }; 
        return args; 
    } 
    

    }

    1

    nullableではない列がプライマリキーになっているようです。コンポジットキーのどの部分もnull値に設定できません。

    null可能なプロパティを取得してプライマリ/コンポジットキーの外に配置する必要があります。

    また、これは "null複合キー"をGoogleで検索したときに#3となったHibernate mapping a composite key with null valuesの複製のようです。

    +0

    列自体は一意ではなく、列の組み合わせのみであるため、null以外の列をPKとして配置できないことに注意してください。私はこれが悪いデザインだと知っていますが、私はDBモデルをコントロールできません。 –

    +1

    列の組み合わせは常に一意(NULL値があるかどうか)であり、列のセットはnullではないので(null不可能な列のため)、これは実行できると思いました。 –

    +0

    データベースはこれを許可するものではありませんが、いくつかは許可します。あなたがデータベーススキーマを制御できないことは残念です。あなたはスキーマを管理している人々と話すことができますか? 申し訳ありませんが、休止状態でこの作業を行うための回避策/ハックについてはわかりません。 –

    関連する問題