【发布时间】: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 使用相同或不同的内存。
如果相同就可以.. 否则可能会导致内存利用率更高的任何执行问题。?
请帮忙...
【问题讨论】:
标签: performance memory-leaks one-to-many hibernate-onetomany