【问题标题】:I can't see logs in JPA with hibernate我在休眠的 JPA 中看不到日志
【发布时间】:2015-10-10 16:13:59
【问题描述】:

我已经在persistence.xml中设置了属性

<property name="hibernate.show_sql" value="true" /> 

但是!当我执行具有插入 SQL 和选择 SQL 的方法的源时,我在控制台上看不到有关选择 SQL 的日志。只是我可以看到有关插入 SQL 的日志。

为什么?这是正确的?

public class JpaMain
{

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();

        try{
            tx.begin();
            System.out.println("###########save start#################");
            save(em);
            System.out.println("###########save end#################");
            System.out.println("###########find start#################");
            find(em);
            System.out.println("###########find end#################");

            tx.commit();

        }

        catch(Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        finally{
            em.close();
        }

        emf.close();
    }

    public static void save(EntityManager em) {
        Product productA = new Product();
        productA.setId("productA");
        productA.setName("pA");
        em.persist(productA);

        Member member1 = new Member();
        member1.setId("member1");
        member1.setUsername("m1");
        member1.getProducts().add(productA);
        em.persist(member1);
    }

    public static void find(EntityManager em) {
        for (Product product : em.find(Member.class, "member1").getProducts()) {
            System.out.println(product.getName());
        }
    }
}

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    当您执行find 时,它需要经过不同的缓存层:

    持久化上下文 > 共享缓存 > 对数据库的 SQL 查询

    Persistence Context 可以被视为缓存,因为它保留对所有托管实体的引用。

    如果实体存在于持久性上下文中,则返回托管实例。如果它不存在或者还没有与实体管理器相关联的持久性上下文,则实体管理器进入工厂 查看共享缓存是否有实体实例。如果是这样,则从共享实体创建一个新实体并将其插入持久性上下文中,并将新的托管实例返回给调用者。如果它不在共享缓存中,则会生成 SQL 查询 以从数据库中选择实体。

    在您的情况下,persistfind 操作已在同一事务中调用。因此,通过持久化,您的实体将成为托管实体,它们将存储在持久化上下文中。之后,您执行了find 方法,并且由于您的实体已经在持久性上下文中,它将不再需要对数据库执行任何 SQL 查询。将返回位于持久性上下文中的实体对象。

    这应该可以解释为什么您没有记录任何 SELECT SQL。

    【讨论】:

      猜你喜欢
      • 2011-11-06
      • 1970-01-01
      • 2020-06-30
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多