一对多双向性能问题

Posted

技术标签:

【中文标题】一对多双向性能问题【英文标题】:one-to-many bidirection performance issue 【发布时间】:2011-10-20 12:45:59 【问题描述】:

我有一个疑问,那就是当我们将 一对多 创建为双向时。我们将在子类中放置一个父类引用。

查看代码。

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;
         ....
         ....

地址.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)

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

但在地址类 person 变量中也保存了 parent(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】:

Hibernate 进行身份检查。一个休眠会话仅包含具有相同 ID 的对象的单个实例。因此,如果 per, per1,...per99 是一个人,那么您将拥有一个对象。否则 - 不同的对象。

【讨论】:

你的意思是它不是多使用一个内存空间,率? 对不起。我不完全理解你的问题。 person 对象只有一个。还有谁可以使用更多的内存空间?

以上是关于一对多双向性能问题的主要内容,如果未能解决你的问题,请参考以下文章

通过大量一对多映射提高查询性能

大规模的一对多性能

一对多关系中的 PHP 和 API 调用性能和最佳实践

hibernate 一对多双向的问题~~~

jpa休眠一对多双向[重复]

JPA 一对多双向堆栈溢出问题