私はいくつかの表をモデル化するためにHibernateのJPA implを使用しています。Jpaコンポジットキーのnull可能な列
- が、私はそれをハックして定義しようとしました
NULL可能できる3そのうち4列、上で一意のインデックスを持ってい
ありがとうございます。
私はいくつかの表をモデル化するためにHibernateのJPA implを使用しています。Jpaコンポジットキーのnull可能な列
NULL可能できる3そのうち4列、上で一意のインデックスを持ってい
ありがとうございます。
作業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;
}
}
nullableではない列がプライマリキーになっているようです。コンポジットキーのどの部分もnull値に設定できません。
null可能なプロパティを取得してプライマリ/コンポジットキーの外に配置する必要があります。
また、これは "null複合キー"をGoogleで検索したときに#3となったHibernate mapping a composite key with null valuesの複製のようです。
列自体は一意ではなく、列の組み合わせのみであるため、null以外の列をPKとして配置できないことに注意してください。私はこれが悪いデザインだと知っていますが、私はDBモデルをコントロールできません。 –
列の組み合わせは常に一意(NULL値があるかどうか)であり、列のセットはnullではないので(null不可能な列のため)、これは実行できると思いました。 –
データベースはこれを許可するものではありませんが、いくつかは許可します。あなたがデータベーススキーマを制御できないことは残念です。あなたはスキーマを管理している人々と話すことができますか? 申し訳ありませんが、休止状態でこの作業を行うための回避策/ハックについてはわかりません。 –