嗨,我在休眠中创建了多对一的关系。 以下是该代码。休眠状态下的内存不足
有成千上万的存在于乙表中的记录是链接表A的单记录当我用getBList()方法它将返回数千记录和JAVA的熄灭存储器。 那么我该如何解决这个问题。
@Entity
@Table(name = "A")
public class A {
private int Id;
private String aName;
private List<MksReleaseInfo> bList;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
public int getId() {
return releaseId;
}
public void setId(final int Id) {
this.Id = Id;
}
@Column(name = "aname", unique = true)
public String getAName() {
return aName;
}
public void setAName(final String aName) {
this.aName = aName;
}
@OneToMany(mappedBy = "aName")
public List<MksReleaseInfo> getBList() {
return bList;
}
public void setBList(final List<B> bList) {
this.bList = bList;
}
}
@Entity
@Table(name = "B")
public class B {
private int bIndex;
private int bpriority;
private A aName;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
protected int getBIndex() {
return mksReleaseInfoIndex;
}
protected void setBIndex(final int bIndex) {
this.bIndex = bIndex;
}
@Column(name = "priority")
public int getBPriority() {
return bpriority;
}
public void setBPriority(final int bpriority) {
this.bpriority = bpriority;
}
@ManyToOne
@JoinColumn(name = "Id")
public A getAName() {
return aName;
}
public void setAName(final A aName) {
this.aName = aName;
}
}
之后所有的评论我已经实现了下面的代码。但它又一次给出了记忆。我是否应该明确清空内存,以及如何?
public List<B> getList(String name, int offset, int limit) throws DAOException {
try {
String hql = "from B where name = :name";
begin();
Query query = getSession().createQuery(hql);
query.setString("name", name);
if(offset > 0){
query.setFirstResult(offset);
}
if(limit > 0){
query.setMaxResults(limit);
query.setFetchSize(limit);
}
commit();
return query.list();
} catch (HibernateException e) {
rollback();
}
}
public Long countB(String name) throws DAOException {
try {
String hql = "select count(*) from B where name = :name";
begin();
Query query = getSession().createQuery(hql);
query.setString("name", name);
commit();
return (Long)query.uniqueResult();
} catch (HibernateException e) {
rollback();
}
}
long count = countB(name);
int counter = (int) (count/200);
if(count%200 > 0){
counter++;
}
for(int j = 0;j<counter;j++){
lists = getList(name, j*200, 200);
for(B count1 : lists){
System.out.println(count1);
}
}
所以你说什么问题是,我建议你改变你的算法。您想做什么?我相信有非常罕见的情况,当你需要把数千个“关系”的关系放在一起时。 – 2012-07-06 06:31:44
您也可以测试'StatelessSession',它可以帮助.... – 2012-07-06 06:32:53