Поскольку вы действительно не дали много информации об определении ваших объектов, я собираюсь сделать некоторые предположения.
- Дом к человеку - один ко многим
- Человек можетпринадлежат только одному дому
Убедитесь, что дом определен следующим образом:
@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;
}
}
Теперь ваш код:
beginTransaction();
House house = houseDao.find(1L);
commitTransaction()
... your magic
Person person = new Person(house,"Dilbert");
session.saveOrUpdate(person);
В приведенном выше примере, когдавы работаете с отношениями Родитель / Ребенок (не важно, один это для многих или многие для многих), вы можете установить отношения через ребенка.Я обычно держусь подальше от просто делать общие обновления через родителя.В вашем примере вы видите, что много над головой.Когда вы начинаете работать там, где есть тысячи записей, это становится невозможным.
Еще одна вещь, на которую стоит обратить внимание, в зависимости от вашей модели, вносит небольшие изменения в аннотации к вашим спискам.Пример:
@Entity
public class House implements Serializable {
@Id
private int id;
@OneToMany(mappedBy="house")
@Fetch(FetchMode.JOIN)
private Set<Person> people;
... rest of your class
}
Учитывая, что @Fetch не является частью спецификации JPA, а представляет собой аннотацию гибернации, это, в зависимости от вашей модели, может значительно повысить производительность, поскольку захватит объект дома и вселюди в одном запросе.Это очень эффективно, если вы ограничиваете количество домов и людей, которые принадлежат к дому.Если вы получаете очень большие наборы результатов, это может быть не очень хорошая ситуация.Следующий пример может быть более подходящим:
@Entity
public class House implements Serializable {
@Id
private int id;
@OneToMany(mappedBy="house")
@Fetch(FetchMode.SUBSELECT)
private Set<Person> people;
... rest of your class
}
Это будет использовать два запроса для захвата всех объектов.Один запрос для объекта Дома (или умножение объектов дома в зависимости от запроса) и Один запрос для всех людей для объекта (ов) дома.