Разве 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 ответ

Вот что здесь происходит:

  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.
    

    Вы увидите разницу на своей консоли.

  2. Почему не появляется второй запрос

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

    Вы найдете подробный пример этого сценария на этой странице: Hibernate кэш второго уровня. (просто посмотрите последний пример, он похож на то, что вы получаете)

Другие вопросы по тегам