繁体   English   中英

我在休眠时看不到 JPA 中的日志

[英]I can't see logs in JPA with hibernate

我已经在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());
        }
    }
}

在此处输入图片说明

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

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

持久性上下文可以被视为缓存,因为它保留对所有托管实体的引用。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM