Это ужасный дизайн, и я его не рекомендую (вы должны просто создать другую таблицу), но это возможно.
Во-первых, вам нужно будет использовать атрибут byte[]
для хранения сериализованной версии списка лиц, которые будут храниться в BLOB в базе данных. Так что аннотируйте его getter с @Lob
(я бы сделал геттер и сеттер 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
(или я почему вы используете базу данных).
Это не ясно. Если вы видите familly как группу людей, вам нужна новая таблица для familly, за исключением случаев, когда вы представляете familly с простым типом, например, целым числом или строкой. – Kartoch
OT: Это будет плохой дизайн. –
Если у семьи 3 члена, какое значение вы ожидаете увидеть в столбце базы данных? –