2013-07-12 8 views
0

Загрузка сеанса кажется бесполезной, если мне нужно создать pojo, почему мне нужно использовать нагрузку для создания объекта, который не может быть вызван?Что такое session.load, используемый для

@Test 
public void testTwoSession() { 
    Session session = sessionFactory.getCurrentSession(); 
    session.beginTransaction(); 
    Teacher t = (Teacher) session.load(Teacher.class, 2); 
    System.out.println(t); 
    session.getTransaction().commit(); 
    System.out.println(t); 
} 

перед фиксацией, то объект будет напечатан, но когда сессия совершается операция печати будет fail.now мне интересно, почему бы просто не использовать получить метод, чтобы получить объект Учителя.

ответ

0

«session.load()» не бесполезен, это очень важная операция во многих ситуациях. Разница между «» и «get» заключается в том, что «load» создает так называемый «прокси», который является временным спящим объектом, который фактически не читает БД. Наоборот, метод «get» всегда считывает фактические данные (если он не существует, он возвращает null).

В вашем сценарии это не будет иметь большого значения (load() и оба будут читать объект), но представьте сценарий, в котором вы хотите сделать вставку в строке. В этом случае у вас будет «load()», делая «1 вставку», а «get()« делает »1 читает« + »1 вставить».

+0

load() не проверяет, существует ли объект. В вашем сценарии вы получите исключение во время сброса, если объект не существует, если у вас есть ограничение внешнего ключа в базе данных. –

+0

, но я могу написать интерфейс, подобный следующему 'Teacher findTeacher (int id);', но сеанс близок после того, как я его совершил. Т.е. я никогда не могу использовать метод загрузки для реализации этого интерфейса. – ssj

+0

@ JBNizet вы правы, нет проверки, только исключение «ObjectNotFoundException». – emgsilva

0

Метод load() в основном полезен, когда вы просто хотите ссылку на объект, но на самом деле не заботится о его состоянии, например, когда вы просто хотите присоединить этот объект к другому:

public void createMessageForSender(String text, String senderId) { 
    Message message = new Message(); 
    message.setText(text); 
    Sender sender = (Sender) session.load(Sender.class, senderId); 
    message.setSender(sender); 
    session.persist(message); 
} 

В приведенном выше коде вам нужна ссылка сущности отправителя для создания нового объекта сообщения, но вам не важно его состояние и не нужно загружать его из базы данных. load() полезен.

+0

, но если вы закроете сеанс после загрузки, это означает, что отправитель ничего не может сделать. Возможно, он допустит ошибку, которую вы не найдете. – ssj

+1

Я тебя не понимаю. Как только вы закроете сеанс, если у вас есть незагруженные ленивые объекты и ассоциации, переход через них приведет к исключению. Но вы не будете загружать всю базу данных каждый раз на всякий случай, если это может понадобиться вызывающему. Итак, если вам не нужно состояние, вы не загружаете его. И если вам это нужно, вы загружаете его. Так просто. В моем примере вызывающий абонент не может даже ссылаться на сообщение или на его отправителя, поэтому зачем мне загружать состояние отправителя? –

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