Это ужасный дизайн, и я действительно не рекомендую его (вы должны просто создать другую таблицу), но это возможно.
Во-первых, вам нужно будет использовать атрибут byte[]
для хранения сериализованной версии списка людей, который будет сохранен в BLOB-базе данных. Так что пометьте его как getter с @Lob
(я бы сделал getter и setter private
, чтобы не выставлять их). Затем откройте «поддельные» методы получения и установки для возврата или установите List<Person>
из byte[]
. Я использую SerializationUtils
от Commons Lang в приведенном ниже примере (укажите собственный класс помощника, если вы не хотите импортировать эту библиотеку) для сериализации / десериализации на лету в / из byte[]
. Не забудьте пометить «поддельный» метод получения с помощью @Transcient
, иначе Hibernate попытается создать поле (и потерпит неудачу, потому что не сможет определить тип для List
).
@Entity(name = "family")
class Family implements Serializable {
// ...
private byte[] familyMembersAsByteArray;
public Family() {}
@Lob
@Column(name = "members", length = Integer.MAX_VALUE - 1)
private byte[] getFamilyMembersAsByteArray() { // not exposed
return familyMembersAsByteArray;
}
private void setFamilyMembersAsByteArray((byte[] familyMembersAsByteArray() { // not exposed
this.familyMembersAsByteArray = familyMembersAsByteArray;
}
@Transient
public List<Person> getFamilyMembers() {
return (List<Person>) SerializationUtils.deserialize(familyMembersAsByteArray);
}
public void setParticipants(List familyMembers) {
this.familyMembersAsByteArray = SerializationUtils.serialize((Serializable) familyMembers);
}
}
Не забудьте создать Person
класс Serializable
и добавить реальное serialVersionUID
(я просто показываю здесь значение по умолчанию):
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
// ...
private String firstName, lastName;
private int age;
}
Но, позвольте мне настаивать, это ужасный дизайн, и он будет очень хрупким (изменение Person
может потребовать «переноса» содержимого BLOB во избежание проблем с десериализацией, и это станет болезненным. эта идея и использовать другую таблицу для Person
вместо этого (или я не понимаю, почему вы используете базу данных).