Другие комментарии об использовании @Lob правильны для типа файла.Также верно, что если вы можете изменить схему, чтобы не сохранять данные файла в БД, вам, вероятно, следует сделать это.
Чтобы отобразить ваш класс PhoneNumber в поле базы данных, вам нужно будет использоватьпользовательский тип Hibernate.Он в основном говорит Hibernate, КАК сделать отображение объекта <-> db для классов, о которых он еще не знает.Настроить поле PhoneNumber в Person для использования пользовательского типа пользователя очень просто:
@Type(type = PhoneNumberType.CLASS_NAME)
@Column
private PhoneNumber phone;
Это предполагает очень простое хранение номера телефона в одну колонку.
Чтобы написать PhoneNumberType, вы 'Вам нужно будет реализовать UserType.С сборкой / дизассемблированием / deepCopy это выглядит ошеломляюще, но основная часть, которая вас волнует, это nullSetGet / Set, returnClass и sqlTypes.В итоге вы получите такой код внутри своего пользовательского типа:
@Override
public Class<?> returnedClass() {
return PhoneNumber.class;
}
@Override
public int[] sqlTypes() {
return new int[] { Types.VARCHAR };
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
final String value = rs.getString(names[0]);
return /* PhoneNumber instance created from string. */
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
if (value == null) {
st.setNull(index, Types.VARBINARY);
return;
}
st.setString(index, ((PhoneNumber) value).toString());
}
Вы можете найти много информации о том, как реализовать другие методы, через google, stackoverflow и hibernate javadocs.Это не так сложно сделать.
ОБНОВЛЕНИЕ: пользовательский тип с несколькими столбцами
Реализация CompositeUserType
вместо просто UserType
.Есть несколько изменений метода, которые вас волнуют.Сначала вы захотите определить несколько имен и типов свойств:
public String[] getPropertyNames() {
return new String[] { "number", "code" };
}
public Type[] getPropertyTypes() {
return new Type[] { StandardBasicTypes.STRING,
StandardBasicTypes.STRING };
}
Также необходимо реализовать getPropertyValue
/ setPropertyValue
.Ваши реализации nullSafeXxxx изменится на чтение и запись двух свойств вместо одного:
@Override
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
// Access column in order defined in getPropertyNames()
final String number = rs.getString(names[0]);
final String code = rs.getString(names[1]);
return /* PhoneNumber instance created from number and country code. */
}