我用hibernate看不到JPA中的日志

时间:2015-10-10 16:13:59

标签: java hibernate jpa

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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

持久性背景&gt;共享缓存&gt;对数据库的SQL查询

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

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

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

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