To jest okropny projekt i naprawdę nie polecam go (powinieneś po prostu stworzyć inny stół), ale jest to możliwe.
Najpierw należy użyć atrybutu byte[]
, aby zachować zserializowaną wersję listy osób, które będą przechowywane w obiekcie BLOB w bazie danych. Więc zanotuj, że to jest getter z @Lob
(chciałbym sprawić, żeby setter i private
nie wystawiały ich). Następnie ujawnij "fałszywy" program pobierający i ustawiający, aby powrócić lub ustawić List<Person>
z . Używam z Commons Lang w poniższym przykładzie (pod warunkiem, że nie masz własnej klasy pomocniczej, jeśli nie chcesz importować tej biblioteki) do serializowania/deserializacji w locie do/z byte[]
. Nie zapomnij oznaczyć "fałszywego" gettera za pomocą @Transcient
lub Hibernate spróbuje utworzyć pole (i nie powiedzie się, ponieważ nie będzie w stanie określić typu dla 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);
}
}
Nie zapomnij zrobić klasę Serializable
Person
i dodać prawdziwy serialVersionUID
(ja po prostu pokazano domyślne tutaj):
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
// ...
private String firstName, lastName;
private int age;
}
Ale pozwól mi nalegać, to jest straszny projekt i będzie bardzo delikatny (zmiana Person
może wymagać "migracji" zawartości obiektu BLOB, aby uniknąć problemów z deserializacją, co stanie się bolesne. Powinieneś naprawdę rozważyć ten pomysł i zamiast tego użyć innej tabeli dla Person
(lub Nie rozumiem, dlaczego korzystasz z bazy danych)
To nie jest jasne. Jeśli widzisz rodzinę jako grupę osób, potrzebujesz nowej tabeli dla rodziny, chyba że reprezentujesz rodzinę prostym typem, takim jak liczba całkowita lub ciąg znaków. – Kartoch
OT: To byłby zły projekt. –
Jeśli rodzina ma 3 członków, jakiej wartości spodziewałbyś się w kolumnie bazy danych? –