Questo è un design orribile e in realtà non lo raccomando (dovresti semplicemente creare un altro tavolo) ma è possibile.
Innanzitutto, è necessario utilizzare un attributo byte[]
per contenere una versione serializzata dell'elenco di persone che verranno archiviate in un BLOB nel database. Quindi annota che è getter con @Lob
(vorrei rendere il getter e setter private
per non esporli). Quindi, esporre getter e setter "falsi" per restituire o impostare uno List<Person>
dallo byte[]
. Sto usando SerializationUtils
da Commons Lang nell'esempio qui sotto (fornisci la tua classe di supporto se non vuoi importare questa libreria) per serializzare/deserializzare al volo a/da byte[]
. Non dimenticare di contrassegnare il getter "falso" con @Transcient
o Hibernate proverà a creare un campo (e fallirà perché non sarà in grado di determinare il tipo per un 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);
}
}
Non dimenticate di fare il Person
classe Serializable
e di aggiungere un vero e proprio serialVersionUID
(sto solo mostrando un default qui):
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
// ...
private String firstName, lastName;
private int age;
}
Ma, mi permetta di insistere, si tratta di un design orribile e sarà molto fragile (il cambiamento di Person
potrebbe richiedere di "migrare" il contenuto del BLOB per evitare problemi di deserializzazione e questo diventerà doloroso. Dovresti davvero riconsiderare questa idea e usare un'altra tabella per lo Person
invece (o I don capisco perché usi un database)
fonte
2010-01-23 10:50:35
Questo non è chiaro. Se stai vedendo familly come un gruppo di persone, allora hai bisogno di un nuovo tavolo per familly, tranne se rappresenti la famiglia con un tipo semplice come un numero intero o una stringa. – Kartoch
OT: Sarebbe un cattivo progetto. –
Se una famiglia ha 3 membri, quale valore ti aspetti di vedere nella colonna del database? –