Bonjour J'ai créé plusieurs relations en hibernation. Voici le code pour cela.TROUVEZ LA MÉMOIRE en hibernation
il y a des milliers d'enregistrements présents dans la table B qui est un lien vers un enregistrement unique de la table A. Lorsque j'ai utilisé la méthode getBList(), elle retournera des milliers d'enregistrements et JAVA sortira de mémoire. Alors, comment puis-je résoudre ce problème.
@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;
}
}
après tous les commentaires j'ai implémenté le code suivant. mais encore une fois il donne de mémoire. Dois-je vider la mémoire explicitement et comment?
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);
}
}
Donc, vous avez dit quel est le problème, je vous recommande de changer votre algorithme. Qu'est-ce que tu veux faire? Je crois qu'il y a de très rares cas où vous avez besoin d'aller chercher des milliers de "plusieurs" côtés de la relation ensemble. –
Vous pouvez tester 'StatelessSession' aussi, il peut aider .... –