Составной ключ Jpa nullable столбцы

Что ж, я наконец-то нашел решение

, выполнив следующее:

HttpWebResponse HttpWebResponse = (HttpWebResponse)HttpWebRequest.GetResponse();

и прочитав HttpWebResponse.Headers, где оно выглядит как:

Set-Cookie: expiration=for+5+seconds; expires=Mon, 25-Mar-2019 13:47:30 GMT; path=/

я заметил что файлы cookie, хранящиеся в HttpWebResponse.Cookies, имеют Cookie.Expires на основе Machine DateTime Mon, 25-Mar-2019 14:47:30 GMT (как вы могли бы получить с DateTime.Now), а не на UTC DateTime (например: DateTime.UtcNow)

как я строил свое строковое значение cookie для InternetSetCookieEx на основе HttpWebResponse.Cookies. Затем я получил + 1 час (потому что я во Франции) с истекающим DateTime, который, по сути, должен быть UTC DateTime.

Решением было преобразовать его в UTC следующим образом:

Values += "; expires=" + Cookie.Expires.ToUniversalTime().ToString("R");

Моя последняя мысль: в Windows 10 должно быть какое-то исправление, которого нет в Windows 7 для InternetSetCookieEx , Он автоматически корректирует время истечения до UTC, если строка, содержащая GTM DateTime, неверна. (это, вероятно, не точно, но у вас есть идея)

5
задан Miguel Ping 23 March 2009 в 16:29
поделиться

2 ответа

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

Посмотрите мой пример. Поле представляет собой числовое значение, допускающее значение NULL, поэтому моя реализация выглядит так:

Похоже на файл 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;
}

}

2
ответ дан 15 December 2019 в 01:11
поделиться

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

Необходимо будет взять nullable свойства и разместить их за пределами основного / составного ключа.

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

2
ответ дан 15 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: