Weil Sie wirklich nicht viel über die Definition Ihrer Objekte gegeben haben, werde ich einige Annahmen machen.
- Home wird eine Person zu viele
- Person kann nur zu einem Haus gehören
Achten Sie darauf, das Haus ist definiert wie:
@Entity
public class House implements Serializable {
@Id
private int id;
@OneToMany(mappedBy="house")
private Set<Person> people;
... rest of your class
}
@Entity
public class Person implements Serializable {
@Id
private int id;
@ManyToOne(targetEntity=House.class)
private House house;
@Column(name="person_name")
private String name
... rest of your class
public Person(House house, String name) {
this.house = house;
this.name = name;
}
}
jetzt Ihr Code:
beginTransaction();
House house = houseDao.find(1L);
commitTransaction()
... your magic
Person person = new Person(house,"Dilbert");
session.saveOrUpdate(person);
In der Prüfung Wenn Sie mit Eltern-Kind-Beziehungen arbeiten (egal, ob es eins zu viele oder viele zu viele sind), können Sie die Beziehung durch das Kind herstellen. Ich bleibe in der Regel davon ab, nur generelle Aktualisierungen durch die Eltern zu machen. In Ihrem Beispiel sehen Sie, dass es viel Kopfsache ist. Wenn Sie anfangen zu arbeiten, wo es Tausende von Datensätzen gibt, wird es unmöglich.
Die andere Sache, die Sie untersuchen müssen, ist, abhängig von Ihrem Modell, subtile Änderungen an den Anmerkungen zu Ihren Listen vorzunehmen. Ein Beispiel:
@Entity
public class House implements Serializable {
@Id
private int id;
@OneToMany(mappedBy="house")
@Fetch(FetchMode.JOIN)
private Set<Person> people;
... rest of your class
}
Da @Fetch nicht Teil der JPA-Spezifikation, sondern eine Hibernate Annotations, dies, je nach Modell kann einem großen Leistungsschub geben, weil es das Haus Objekt grap wird und alle Menschen in einer einzigen Abfrage. Dies ist sehr effektiv, wenn Sie die Anzahl der Häuser und Personen begrenzen, die zum Haus gehören. Wenn Sie sehr große Ergebnismengen erhalten, ist dies möglicherweise keine gute Situation. Das nächste Beispiel könnte besser geeignet sein:
Dies wird zwei Abfragen verwenden, um alle Objekte zu greifen. Eine Abfrage für das House-Objekt (oder multiplizieren Sie Hausobjekte abhängig von der Abfrage) und Eine Abfrage für alle Personen für das/die Hausobjekt (e).
Entschuldigung, In meinem Beitrag habe ich festgestellt, dass ich Set verwendet habe und Ihr Beispiel verwendet Liste. Sie können von Set zu Liste wechseln. – celias
Der beste Vorschlag hier ist, die "Person" nicht das "Haus" zu bestehen. +1 –
brilliant - danke Celias. Genau das, was ich gesucht habe. – digiarnie