#performance #memory-leaks #one-to-many #hibernate-onetomany
#Производительность #утечки памяти #один ко многим #спящий режим -onetomany
Вопрос:
у меня есть одно сомнение, это когда мы создаем один ко многим как двунаправленный. мы поместим одну ссылку на родительский класс в дочерний класс.
смотрите код.
Person.java
@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;
....
....
}
здесь Person.java является родительским классом и адресом.java является дочерним классом.
когда мы извлекаем родительский объект из базы данных, он загружает дочерний класс. все в порядке. никаких проблем.
но в обратном ie. если мы извлекаем дочерний класс, он также содержит родительский класс (person).
например: мы извлекаем адрес по идентификатору адреса. просто предположим, что получен адрес 100 из базы данных.
но в переменной класса адресов person также содержится родительский объект (Person).
мои сомнения здесь
используется другая память 100 человека. с теми же данными. в классе адресов. ?
мой dao такой.
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;
просто предположим, что размер addrssList равен 100.
Нравится
per = addressList.get(0).getPerson() ,
per 1 = addressList.get(1).getPerson(),
per2 = addressList.get(2).getPerson(),
....
per99 = addressList.get(99).getPerson().
здесь per1, per2 …. и per 99 используют одну и ту же память или разные.
если то же самое, все в порядке .. иначе это может вызвать какую-либо проблему с использованием большего объема памяти.?
помогите, пожалуйста…
Ответ №1:
В режиме гибернации выполняется проверка подлинности. Один сеанс гибернации содержит только один экземпляр объекта с тем же идентификатором. Итак, если per, per1, … per99 — это один человек, у вас будет один объект для него. В противном случае — разные объекты.
Комментарии:
1. вы имеете в виду, что не используется еще одно пространство памяти, скорость?
2. Извините. Я не совсем понимаю ваш вопрос. Объект
person
только один. Кто еще мог бы использовать еще одно пространство памяти?