一对多双向性能问题

时间:2011-10-20 12:45:59

标签: performance memory-leaks one-to-many hibernate-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 是父类, Address.java 是子类。 当我们从数据库中获取父对象时,它正在加载子类。没事。没问题。

但反之亦然。如果我们提取子类,它也持有父类(人)

例如:我们通过地址ID获取地址。假设从数据库中检索到100个地址。

但在地址类 person 变量中保持父(Person)对象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;

假设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 ....和每99 使用相同的内存或不同。

如果相同则没问题。否则可能导致任何执行更多内存利用率问题。?

帮助请...

1 个答案:

答案 0 :(得分:0)

Hibernate进行身份检查。一个hibernate会话仅包含具有相同ID的对象的单个实例。所以,如果per,per1,... per99是一个人,你将拥有一个对象。否则 - 不同的对象。