我已经在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());
}
}
}
答案 0 :(得分:0)
当您执行find
时,需要经历不同的缓存层:
持久性背景&gt;共享缓存&gt;对数据库的SQL查询
持久性上下文可以被视为缓存,因为它保留了对所有托管实体的引用。
如果实体存在于持久性上下文中,则返回托管实例。如果它不存在或者没有与实体管理器关联的持久性上下文,则实体管理器将进入工厂 查看共享缓存是否具有实体实例。如果是,则从共享实体创建新实体并将其插入到持久性上下文中,并将新的托管实例返回给调用者。如果它不在共享缓存中,则会生成 SQL查询以从数据库中选择实体。
在您的情况下,同一事务中已调用persist
和find
个操作。因此,通过持久化,您的实体将被管理,并且它们将存储在持久性上下文中。之后,您执行了find
方法,并且由于您的实体已经在持久化上下文中,因此不再需要对数据库执行任何SQL查询。将返回位于持久性上下文中的实体对象。
这可以解释为什么你没有记录任何SELECT SQL。