【问题标题】:Hibernate : JDBC connection established but no statements executedHibernate:已建立 JDBC 连接但未执行任何语句
【发布时间】:2017-12-23 13:39:45
【问题描述】:

我使用 spring boot 和 hibernate 制作了一个 DAO 库。 DAO 方法的所有单元测试都运行良好。 但是当我在另一个 spring boot 项目中使用这个 jar 时,与数据源的 JDBC 连接已经建立,但语句既没有准备也没有执行。 DAO bean 被正确注入,会话和事务打开。 我没有其他错误或异常。

Hibernate 统计记录了这个:

2017-07-18 14:57:31.440  INFO 13736 --- [           main] i.StatisticalLoggingSessionEventListener : Session Metrics {
75050 nanoseconds spent acquiring 1 JDBC connections;
0 nanoseconds spent releasing 0 JDBC connections;
0 nanoseconds spent preparing 0 JDBC statements;
0 nanoseconds spent executing 0 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
0 nanoseconds spent performing 0 L2C puts;
0 nanoseconds spent performing 0 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
52279 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections)

有什么想法吗?

编辑:我的一些代码

DAO 实现:

@Repository
public class CompagnieDaoImpl implements CompagnieDao {

    private final Logger logger = LoggerFactory.getLogger(CompagnieDaoImpl.class);

    @Autowired
    private SessionFactory sessionFactory;

    @SuppressWarnings("unchecked")
    @Override
    public List<Compagnie> get() {
        Session session = null;
        Transaction transaction = null;
        List<Compagnie> compagnies = null;
        try {
            session = sessionFactory.openSession();
            transaction = session.beginTransaction();
            compagnies = session.createCriteria(Compagnie.class).list();
            transaction.commit();
        } catch (Throwable ex){
            logger.error("CompagnieDaoImpl.get exception : " + ex.getMessage());
            if (session != null) {
                transaction.rollback();
            }
        } finally {
            if (session != null) {
                session.close(); 
            }
        }       
        return compagnies;
    }

DAO 接口:

public interface CompagnieDao {
    public List<Compagnie> get();
}

自定义属性:

{"properties": [
  {
    "name": "clipperton.datasource.password",
    "type": "java.lang.String",
    "description": "A description for 'clipperton.datasource.password'"
  },
  {
    "name": "clipperton.datasource.url",
    "type": "java.lang.String",
    "description": "A description for 'clipperton.datasource.url'"
  },
  {
    "name": "clipperton.datasource.driver-class-name",
    "type": "java.lang.String",
    "description": "A description for 'clipperton.datasource.driver-class-name'"
  },
  {
    "name": "clipperton.datasource.username",
    "type": "java.lang.String",
    "description": "A description for 'clipperton.datasource.username'"
  }
]}

现在,在使用这个库的项目中:

应用程序属性:

#Datasource
spring.jpa.hibernate.ddl-auto=update
clipperton.datasource.url=jdbc:mysql://localhost:3306/clipperton
clipperton.datasource.username=*****
clipperton.datasource.password=*****
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
clipperton.datasource.driver-class-name=com.mysql.jdbc.Driver

#Hibernate
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.org.hibernate.type=TRACE
spring.jpa.properties.hibernate.generate_statistics=true

#debug
debug=true

主类

@SpringBootApplication(scanBasePackages = {"fr.example.spring.clipperton.clippertondao"})
@Import({DataSourceConfiguration.class, SessionFactoryConfiguration.class})
public class ClippertonStandaloneApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClippertonStandaloneApplication.class, args);
    }
}

最后是测试类:

@RunWith(SpringRunner.class)
@SpringBootTest(classes=ClippertonStandaloneApplication.class)
public class ClippertonStandaloneApplicationTests {

    @Autowired
    CompagnieDao compagnieDao;

    @Test
    public void contextLoads() {
         assertNotNull(compagnieDao);
    }

    @Test
    public void readCompanies() {
        List<Compagnie> compagnies = compagnieDao.get();
        assertEquals(1, compagnies.size());
    }

数据源

@Configuration
@EnableAutoConfiguration
public class DataSourceConfiguration {
    @Bean
    @ConfigurationProperties(prefix="clipperton.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}

会话工厂

   @Configuration
    @EnableAutoConfiguration
    public class SessionFactoryConfiguration {
        @Bean
        public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
            HibernateJpaSessionFactoryBean fact = new HibernateJpaSessionFactoryBean();
            fact.setEntityManagerFactory(emf);
            return fact;
        }
    }

【问题讨论】:

  • 我的水晶球坏了。您能否至少包含 一些 代码以显示您所做的工作。
  • 代码已添加,先生。
  • 能否也添加SessionFactoryConfiguration和DataSourceConfiguration类?
  • 完成,注意这些 bean 被注入没有引发任何异常。

标签: hibernate spring-boot jar


【解决方案1】:

Spring Boot 应用程序主类缺少 @EntityScan 注释。

@SpringBootApplication(scanBasePackages = {"fr.example.spring.clipperton.clippertondao"})
@EntityScan(basePackages = "fr.example.spring.clipperton.clippertondao.domain")
@Import({DataSourceConfiguration.class, SessionFactoryConfiguration.class})
public class ClippertonStandaloneApplication { ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多