2017-09-16 56 views
0

我想使用HSQLDB來設置一個簡單的項目來解釋Hibernate的基礎知識。 爲了更好地理解Hibernate的內部,我想安裝P6Spy來顯示相應的SQL語句。P6Spy不會使用HSQLDB記錄hibernate更新

我無法在控制檯中獲取SQL Update語句。

Hibernate: insert into User (id, name) values (null, ?) 
1505546078019|0|statement|connection 0|insert into User (id, name) values (null, ?)|insert into User (id, name) values (null, 'A') 
Hibernate: update User set name=? where id=? 
1505546078027|0|commit|connection 0|| 

P6SPY和Hibernate告訴我的INSERT語句,但只有Hibernate的顯示更新語句

這裏是我的源代碼:

的hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="connection.driver_class">com.p6spy.engine.spy.P6SpyDriver</property> 
     <property name="connection.url">jdbc:p6spy:hsqldb:mem:so</property> 
     <property name="connection.username">sa</property> 
     <property name="connection.password"></property> 
     <property name="dialect">org.hibernate.dialect.HSQLDialect</property> 

     <property name="current_session_context_class">thread</property> 

     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

     <property name="show_sql">true</property> 

     <property name="hbm2ddl.auto">update</property> 
    </session-factory> 
</hibernate-configuration> 

COM /如此/ User.java

package com.so; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 

@Entity 
public class User { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 
    @Column 
    private String name; 

    public User() { 
    } 

    public Long getId() { 
     return id; 
    } 

    protected void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
     return "User [id=" + id + ", name=" + name + "]"; 
    } 

} 

COM /如此/主

package com.so; 

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.AnnotationConfiguration; 

public class Main { 
    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    public static void main(String[] args) { 
     sessionFactory.getCurrentSession().beginTransaction(); 
     User e = new User(); 
     e.setName("A"); 
     sessionFactory.getCurrentSession().save(e); 
     e.setName("B"); 
     sessionFactory.getCurrentSession().getTransaction().commit(); 
    } 

    private static SessionFactory buildSessionFactory() { 
     try { 
      return new AnnotationConfiguration() 
        .addAnnotatedClass(User.class) 
        .configure().buildSessionFactory(); 
     } catch (Throwable ex) { 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 
} 

的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.so</groupId> 
    <artifactId>test-hibernate</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>3.3.2.GA</version> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-annotations --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-annotations</artifactId> 
      <version>3.3.1.GA</version> 
     </dependency> 

     <!-- Hibernate uses slf4j for logging, for our purposes here use the simple 
      backend --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-simple</artifactId> 
      <version>1.7.25</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hsqldb</groupId> 
      <artifactId>hsqldb</artifactId> 
      <version>2.3.4</version> 
     </dependency> 

     <dependency> 
      <groupId>javassist</groupId> 
      <artifactId>javassist</artifactId> 
      <version>3.9.0.GA</version> 
     </dependency> 
     <dependency> 
      <groupId>p6spy</groupId> 
      <artifactId>p6spy</artifactId> 
      <version>3.0.0</version> 
     </dependency> 
    </dependencies> 
</project> 

spy.properties

appender=com.p6spy.engine.spy.appender.StdoutLogger 
+0

你問不了的事,但你得到HSQLDB記錄所有已執行的SQL http://hsqldb.org/doc/2.0/guide/management-chapt.html# mtc_internal_monitoring – fredt

回答

0

我有同樣的問題。對我來說,這是因爲hibernate將更新添加到批處理中,並且默認情況下批處理調用不會記錄在p6spy中。更新p6spy屬性,以便批處理被記錄。

spy.properties

#list of categories to exclude: error, info, batch, debug, statement, 
#commit, rollback and result are valid values 
#excludecategories= 
excludecategories=info,debug,result