Проблема с двунаправленной эффективностью от одного ко многим
-
27-10-2019 - |
Вопрос
У меня есть одно сомнение, тогда мы создаем один ко многим как двунаправленный. Мы поместим однозначное ссылку на родительский класс в детском классе.
Смотрите код.
Человек. Ява
@Entity
@Table(name="PERSON")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="personId")
private int id;
@Column(name="personName")
private String name;
@OneToMany(cascade =CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name="personId")
private Set <Address> addresses;
....
....
}
Address.java
@Entity
@Table(name = "ADDRESS")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "addressId")
private int id;
@Column(name = "address",nullable=false)
private String address;
@ManyToOne(cascade =CascadeType.ALL)
@JoinColumn(name="personId",nullable=false)
private Person person;
....
....
}
здесь Человек. Ява родительский класс и Address.java Детский класс. Когда мы получаем родительский объект из базы данных, он загружает дочерний класс. это нормально. нет проблем.
Но в наоборот, т.е. Если мы получаем урок ребенка, он также проводит родительский класс (человек).
Например: мы получаем адрес по идентификатору адреса. Просто предположим, что извлечен 100 адреса из базы данных.
Но в классе адреса человек Переменная Удерживает родительский (человек) объект ASLO.
Мое сомнение здесь
используется разные 100 памяти человека. с теми же данными. в Адрес класс. ?
Мой дао такой.
public List<Address> getAllAddressByPersonId(int personId) {
List<Address> addressList = null;
try {
DetachedCriteria criteria = DetachedCriteria.forClass(Address.class);
criteria.createCriteria("person").add(Restrictions.eq("id", personId));
addressList = getHibernateTemplate().findByCriteria(criteria);
} catch (HibernateException e) {
e.printStackTrace();
} catch (DataAccessException e) {
e.printStackTrace();
}
return addressList;
Просто предположим, что размер addrssslist составляет 100.
как
per = addressList.get(0).getPerson() ,
per 1 = addressList.get(1).getPerson(),
per2 = addressList.get(2).getPerson(),
....
per99 = addressList.get(99).getPerson().
здесь PER1, PER2 .... и на 99 используют одну и ту же память или разные.
Если то же самое в порядке ... иначе это может вызвать какую -либо проблему с использованием большего количества памяти.?
Помогите, пожалуйста ...
Решение
Hibernate делает проверку личности. Один сеанс Hibernate содержит только один экземпляр объекта с тем же идентификатором. Так что, если за, PER1, ... PE99 - это один человек, у вас будет один объект для него. В противном случае - разные объекты.