Разве session.get() в hibernate не всегда попадает в базу данных?
Теоретически, метод session.get() должен всегда попадать в базу данных, независимо от того, хранится ли объект в кэше или нет. Но всякий раз, когда я использую session.get() или session.load(), оба не попадают в базу данных во второй раз.
Session session = factory.openSession();
tx = session.beginTransaction();
Customer cust = (Customer)session.get(Customer.class,2);
System.out.println(cust.getCid()+","+cust.getFirstName()+","+cust.getLastName()+","+cust.getPhone());
Customer cust2 = (Customer)session.get(Customer.class,2);
System.out.println(cust2.getCid()+","+cust2.getFirstName()+","+cust2.getLastName()+","+cust2.getPhone());
tx.commit();
session.close();
и это вывод,
Hibernate: select customer0_.cid as cid1_1_0_, customer0_.firstName as firstNam2_1_0_, customer0_.lastName as lastName3_1_0_, customer0_.email as email4_1_0_, customer0_.phone as phone5_1_0_, customer0_.aid as aid6_1_0_ from mycustomers customer0_ where customer0_.cid=?
2,Sam,pp,9799999999
2,Sam,pp,9799999999
Запрос на выбор выполняется только один раз, и в следующий раз он извлекается из кэша. Тот же вывод, если я использую метод session.load () также.
Я что-то здесь упускаю? Просьба уточнить.
1 ответ
Вот что здесь происходит:
Первый запрос на консоли
Он всегда вернет "прокси". Например, если вы делаете
session.load(Customer.class, 2)
, он вернет объект прокси. Прокси-объект просто имеет значение идентификатора и ничего больше. Вы можете представить, что это будет примерно так.customer.id = 2; customer.fname = null; customer.lname = null; customer.address = null; //rest all properties are null
Он будет попадать в базу данных каждый раз, когда вы получите доступ к свойствам. В вашем случае вы сразу звоните
ust.getCid()
поэтому он сразу же попадет в базу данных, чтобы получить эти запросы. Таким образом, первый запрос, который вы видите в консоли, появится в обоих случаях (т. Е.session.get()
а такжеsession.load()
)Попробуйте сделать это и посмотрите, как выглядит ваша консоль:
Session session = factory.openSession(); tx = session.beginTransaction(); Customer cust = (Customer)session.get(Customer.class,2); //do not call any getter.
Вы увидите разницу на своей консоли.
Почему не появляется второй запрос
Hibernate Кэш второго уровня
Вы пытаетесь получить доступ к тому же объекту, к которому обращались ранее. Затем Hibernate (вместо того, чтобы извлекать его из базы данных снова) извлекает его из кэша второго уровня.Вы найдете подробный пример этого сценария на этой странице: Hibernate кэш второго уровня. (просто посмотрите последний пример, он похож на то, что вы получаете)