Имея простой класс:
@Entity
class Person{
@Id
private String name;
@ManyTo@Many
@JoinTable(..)
List<Person> friends;
}
Извлечение Person
из базы данных также извлекает его друзей (на основе стратегии извлечения, но давайте пропустим это).
Если я найду человека с именем "Алиса", и у нее есть "Боб" в друзьях, оба лица - Алиса и БоБ.
Итак:
void printFriends() {
Person p = personDao.getPersonByName("Alice");
for(Person f: p.getFriends())
System.out.println(f.getName())
}
Здесь данные извлекаются из БД, объект создается, друзья загружаются, и после того, как функция прекращает выполнение, сборщик мусора выполняет свою работу.
Однако, что, если я хочу сохранить Person p
?
static List<Person> loggedPersons;
void printFriends() {
Person p = personDao.getPersonByName("Alice");
loggedPersons.add(p);
for(Person f: p.getFriends())
System.out.println(f.getName()) // "Bob"
}
Здесь сборщик мусора не может делать свои вещи. На объект p
все еще ссылаются в списке, так что теперь, когда я делаю:
Person p_1 = personDao.getPersonByName("Bob");
Будет ли Hibernate повторно использовать объект от друга Алисы? Или это создает новый объект в памяти?
Если он создает новый объект, есть ли способ, как обойти это, чтобы очистить список друзей?
В приложении, где serve сохраняет зарегистрированных пользователей, как в примере, а также возвращает его друзей, это может привести к огромному использованию памяти, или мне не хватает какого-то шаблона / функциональности?
Спасибо за помощь!