eclipselink J2SE fetchType LAZY эффективное использование - PullRequest
2 голосов
/ 06 ноября 2011

Я разрабатываю свой первый проект EclipseLink J2SE и задаюсь вопросом, есть ли эффективный способ извлечь выгоду из отложенной загрузки даже после доступа к объекту.

Вот пример, иллюстрирующий проблему.Предположим, у нас есть эти 2 сущности:

@Entity
public class Group {
long id;

@ManyToOne
Teacher teacher;

//getters & setters
}

@Entity
public class Teacher {
long id;

@OneToMany(mappedBy="teacher", fetch=FetchType.LAZY)
List<Group> groups;

//getters & setters
}

Чтобы загрузить список учителей (который будет показан в компоненте JTable), я использую статический метод из класса, называемого MyPersistenceManager:

 public static List<Teacher> loadTeachers(){
    Query q=getEM().createQuery("select t from teacher t");
    return (List<Teacher>)q.getResultList();
}

, а затем возвращаемыйНа список будет ссылаться как на атрибут TableModel.

Теперь предположим, что мы хотим загружать список групп, соответствующих выбранному учителю, каждый раз, когда изменяется выбор (здесь нет никаких проблем, вызов геттера выполнит работу), и (вот моя проблема), чтобы сохранить память, очистите память, выделенную для этих групп, когда соответствующий учитель будет отменен.Есть ли способ сделать это?

Примечание: Мой проект, как упомянуто выше, является проектом J2SE и предназначен для локального использования со встроенной базой данных (нет много сетейклиенты).Я использую долгоживущий постоянный контекст (EM), со свойством eclipselink.persistence-context.reference-mode, установленным на «WEAK», и для «shared-cache-mode», равным NONE, чтобы отключить 2-йУровень кеша (бесполезный в моем случае).Еще одна вещь, вы можете сказать, что мне не нужно беспокоиться о проблемах с памятью в режиме WEAK, но правда в том, что режим WEAK не затрагивает объекты, на которые есть ссылки, и в моем случае на список учителей ссылаются, поэтому каждыйАтрибут groups, к которому осуществляется доступ, будет загружен в память до тех пор, пока приложение не закроется ...

Заранее спасибоGeorge

1 Ответ

3 голосов
/ 07 ноября 2011

Либо память является проблемой, либо нет. У вас заканчивается память? Если вы можете иметь всех учителей в памяти, то, вероятно, вы можете иметь и все группы.

В противном случае, если память является проблемой, вы можете пересмотреть свой дизайн.

Обычно используется модель запроса или транзакции. EntityManager будет действовать только во время запроса или транзакции. В конце каждой транзакции создается новый EntityManager или очищается их.

Кроме того, вместо того, чтобы удерживать все экземпляры класса, экземпляры обычно запрашиваются при необходимости, что обычно позволяет пользователю фильтровать результат.

Если вы вместо этого хотите продолжать использовать один долгоживущий EntityManager, вы можете обновить студентов (установить обновление для запроса всех студентов), чтобы вернуть ссылки на их группы.

...