2013-02-21 2 views
0

предположим я получилспящий режим - что когда father.getSons сложилось,() вызывается, когда коллекция ленив

class Father{ 

private Integer fatherId; 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="FATHERID", nullable=false) 
public Integer getFatherId() { 
    return fatherId; 
}  


Set<Son> sons; 

@OneToMany(fetch=FetchType.LAZY) 
@JoinColumn(name="FATHERID") 
public Set<Son> getSons() { 
    return airlineFlights; 
} 
} 

и сын

class Son{ 


Integer sonId 
@Id 
@GeneratedValue(generator="identity") 
@GenericGenerator(name="identity", strategy="identity") 
@Column(name="SONID", nullable=false) 
public Integer getSonId() { 
    return sonId; 
} 

Father father; 

    @ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="FATHERID", nullable=false) 
public Father getFather() { 
    return father; 
} 

} 

Теперь предположим, что я получил этот код:

Father f = session.load(Father.class, 1); 
f.getSons(); 

f является простым POJO, и коллекция сыновей ленива, так что будет здесь? Как gonig в базу данных и запрос для этих сыновей, мы в простой JVM, где вызывается простой get, как работает hibernate?

EDIT: Что происходит, когда getSons(), называется, вы можете дать полный цикл?

+0

возможно дубликат (http://stackoverflow.com/questions/2192242/what-is -lazy-load-in-hibernate) – BalusC

ответ

2

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

Как это работает - byte code instrumentation. За кулисами Hibernate создает объект «прокси» для обертывания вашего объекта и делает вызовы методов из этого прокси-сервера, если это необходимо для выполнения запросов вызывающего абонента.

Очень грубо, происходит нечто подобное: [Что такое ленивая загрузка в Hibernate]

Father (FatherProxy) -> Lazy Collection Reference -> Session -> Load Entities 
+0

Что происходит, когда getSons(), называется, вы можете дать полный цикл? –

+0

Не могу дать полный цикл, его довольно сложно. Но я рассказал о том, что происходит. – Perception

+0

если у вас есть артистическое или какое-то исполнение, пожалуйста, поделитесь им со мной, я хочу знать это подробно –

0

В журналах вы увидите 2 запроса. Первый загружает отца, а затем, потому что вы вызываете getSons(), он пойдет и заберет сыновей, чтобы вы увидели второй запрос.

+0

Вызов 'getSons()' не будет запускать запрос. – BalusC

+0

@BalusC - Bauke - просветите меня, пожалуйста, или вы говорите, что он просто загружает оболочку, и им действительно нужно что-то делать с ней, например getSons(). Get (0), прежде чем запрос действительно будет запущен? –

+0

@BalusC О, lol, просто прочитайте свой комментарий выше на принятом ответе. –

Смежные вопросы