проблема с производительностью в двух направлениях «один ко многим»

#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 только один. Кто еще мог бы использовать еще одно пространство памяти?