[英]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 查询以从数据库中选择实体。
在您的情况下,已在同一事务中调用了persist
和find
操作。 因此,通过持久化,您的实体将被管理并且它们将存储在持久化上下文中。 之后,您执行了find
方法,并且由于您的实体已经在持久化上下文中,它将不再需要对数据库执行任何 SQL 查询。 将返回位于持久上下文中的实体对象。
这应该可以解释为什么您没有记录任何 SELECT SQL。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.