проблема производительности двунаправленного сообщения «один ко многим» - PullRequest
0 голосов
/ 20 октября 2011

У меня есть одно сомнение, это когда мы создаем один-ко-многим как двунаправленный. мы поместим одну ссылку родительского класса в дочерний класс.

см. Код.

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 - родительский класс, а Address.java - дочерний класс. когда мы выбираем родительский объект из базы данных, он загружает дочерний класс. это нормально. нет проблем.

но наоборот т.е. если мы выбираем дочерний класс, он также содержит родительский класс (person) .

Например: мы получаем адрес по идентификатору адреса. просто предположим, что получено 100 адресов из базы данных.

но в адресном классе переменная person содержит родительский объект (Person) также.

моё сомнение здесь

- это использование разной 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;

просто предположим, что размер 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 Ответ

0 голосов
/ 20 октября 2011

Hibernate делает проверку личности. Один сеанс гибернации содержит только один экземпляр объекта с таким же идентификатором. Итак, если per, per1, ... per99 - один человек, у вас будет один объект для него. В противном случае - разные объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...