При попытке выполнить несколько тестов на ленивую загрузку, чтобы проверить, правильно ли я понимаю, я запутался.
Вот сущности, которые я использую в моем тесте:
@Entity
public class Family {
@Id
private int id;
@OneToMany(mappedBy="family", fetch=FetchType.LAZY)
private Set<Person> members;
//getters & setters
public String toString(){
String s="";
for(Person p:getMembers()){
s+=p.getFirstName();
}
return s;
}
}
@Entity
public class Person implements Comparable<Person>{
@Id
private int id;
private String firstName;
private String lastName;
@ManyToOne
private Family family;
//getters &setters
}
вот мой основной метод:
public static void main(String[] args) {
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
em = factory.createEntityManager();
Query q = em.createQuery("select f from Family f");
List<Family> families= q.getResultList();
em.clear();
em.close();
factory.close();
for(Family f:families){
System.out.println(f);
}
}
Что я понял из отложенной загрузки, так это то, что если атрибут помечен для извлечения лениво, и к нему не обращаются, пока он управляется, он не будет загружен в память, и любая попытка получить к нему доступ позже не будет работать. Что меня смущает, так это то, что описанный выше тест не вызывает проблем при доступе к атрибуту lazy members через отдельный список Family даже после закрытия EM и EMF! ... это нормально? Неужели я не понимаю ленивую концепцию загрузки?
Примечание: Я использую среду J2SE со встроенной БД. Мой провайдер EclipseLink
Заранее спасибо
George