Jpa композитный ключ обнуляемые столбцы - PullRequest
3 голосов
/ 23 марта 2009

Я использую JPA Hibernate для моделирования некоторых таблиц. У меня проблемы с отображением таблицы, которая:

  • Не имеет первичного ключа
  • Имеет уникальный индекс на 4 столбца, 3 из которых могут быть обнуляемыми

Я попытался взломать его и определить индекс как составной идентификатор, но, поскольку некоторые столбцы могут иметь значение null, это не работает должным образом Возможно ли это с JPA / Hibernate?

Спасибо

Ответы [ 2 ]

1 голос
/ 19 мая 2009

Обходной путь ... Вы должны реализовать свою собственную реализацию UserType и обработать нулевое значение, чтобы вернуть для этого репрезентативный объект.

Смотри мой пример. Поле является обнуляемым числом, поэтому моя реализация:

Выглядит как в файле HBM :

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

... В Java :

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 голос
/ 23 марта 2009

Кажется, что столбец, который не имеет значения NULL, должен быть вашим первичным ключом. Никакие части составного ключа никогда не должны обнуляться.

Вам нужно будет взять свойства, которые можно обнулить, и поместить их за пределы вашего первичного / составного ключа.

Кроме того, это выглядит как дубликат Hibernate, отображающий составной ключ с нулевыми значениями , который появился как №3, когда я прибегнул к поиску «нулевого составного ключа».

...