使用 Spring Embedded Database 的 JPA 未找到记录

Posted

技术标签:

【中文标题】使用 Spring Embedded Database 的 JPA 未找到记录【英文标题】:JPA with Spring Embebed Database not records found 【发布时间】:2018-09-02 10:14:49 【问题描述】:

从使用 spring、JPA 和 JDBC 连接到 mysql 数据库的程序开始,我正在尝试将该应用程序配置为在嵌入式模式下使用 H2 数据库。

使用 MYSQL 一切正常,但使用 H2 则不行。

我无法让 H2 返回任何记录,尽管记录在那里,所以如果我通过 JDBC 执行相同的查询,如果我看到它们。

我的配置如下:

@Configuration
@EnableJpaRepositories("yages.yagesserver")
@EnableTransactionManagement

public class JpaConfig 

    @Bean
    public DataSource dataSource() 

        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        EmbeddedDatabase db = builder
                .setType(EmbeddedDatabaseType.H2) 
                .setName("yagesh2")
                .ignoreFailedDrops(true)
                .addScript("db/sql/create-db.sql")
                .addScript("db/sql/insert-data.sql")
                .generateUniqueName(false)     
                .build();
        return db;
    
    @Bean
    public HibernateExceptionTranslator hibernateExceptionTranslator() 
        return new HibernateExceptionTranslator();
     
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) throws NamingException 
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());              

        em.setPackagesToScan(new String[]"yages.yagesserver", "yages.yagesserver.dao");
        em.setPersistenceUnitName("yages-server");
        em.setJpaVendorAdapter(jpaVendorAdapter());
        em.afterPropertiesSet();
        return em;
    


    @Bean
    public JpaVendorAdapter jpaVendorAdapter() 
        HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
        jpaVendorAdapter.setGenerateDdl(false);

        jpaVendorAdapter.setDatabase(Database.H2);
        jpaVendorAdapter.setShowSql(true);
        return jpaVendorAdapter;
        


    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) 
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    


所以如果我写这段代码:

String s="SELECT  cal_ano,cal_mes,cal_fecini,cal_fecfin from calendario where cal_ano=? and cal_mes = ?";

        List<Calendario> cal =
                jdbc.query(s,    new Object[]  ano,mes, 
                 (rs, rowNum) -> new Calendario(
                            rs.getInt("cal_ano"),rs.getInt("cal_mes"),rs.getDate("cal_fecini"),rs.getDate("cal_fecfin"))
                        );    
        System.out.println("getDatosSemana. Size "+cal.size()+ "Fecha Inicio: "+cal.get(0).getFechaInicio());

        Optional<Calendario> calOpc = calendarioRepositorio.getCalendario(new CalendarioKey(ano - 1, mes));
        System.out.println("getDatosSemana. Optional is present: "+calOpc.isPresent());

当我使用 JDBC 时,如果记录存在,我会在日历表中看到,但是当使用 JPA 时,它似乎没有找到任何东西。

这是我控制台中的输出:

getDatosSemana. Size 1Fecha Inicio: 2018-01-28
Hibernate: select calendario0_.cal_ano as cal_ano1_0_0_, calendario0_.cal_mes as cal_mes2_0_0_, calendario0_.cal_fecfin as cal_fecf3_0_0_, calendario0_.cal_fecini as cal_feci4_0_0_ from calendario calendario0_ where calendario0_.cal_ano=? and calendario0_.cal_mes=?
getDatosSemana. Optional is present: false

当然,我有 DAO 类和从 CrudRepository 扩展的存储库。

有什么建议吗?

【问题讨论】:

您能添加您的calendarioRepositorio.getCalendario 代码吗?你在使用 Spring 数据 jpa 吗?如果要使用 h2 LocalContainerEntityManagerFactoryBean 不是必须的。你只需要在你的 pom 中定义依赖,Spring boot 就会自动配置你的实体管理器。 谢谢,但我发现了错误……我感到不舒服。看答案 【参考方案1】:

对不起。我发现了错误。 这是一种失败的愚蠢。我调用了 JPA 函数,将年份和月份的参数颠倒过来。 有时你看不到明显的东西。

【讨论】:

以上是关于使用 Spring Embedded Database 的 JPA 未找到记录的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 Spring HATEOAS 中的“_embedded”属性

使用 spring RestTemplate 消耗 json+hal _embedded 资源的问题

使用 Spring Embedded Database 的 JPA 未找到记录

Spring boot Embedded MongoDb 数据预填充

我如何在@Embeddable 类中使用@Embedded 将json 发布到spring boot 控制器

Embedded-Debezium spring boot postgreSQL DB 连接问题