当前位置: 首页 > 知识库问答 >
问题:

未找到带有Spring嵌入数据库的JPA记录

成和悌
2023-03-14

从一个使用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扩展的存储库。

有什么建议吗?

共有1个答案

赵珂
2023-03-14

我很抱歉。我发现了错误。这是一种失败的愚蠢行为。我调用了JPA函数,参数是年和月的倒数。有时你看不到显而易见的东西。

 类似资料:
  • 我是Spring Data JPA的新手。我试图为存储库创建一个自定义方法,但是它确实抛出了一个异常。以下是我目前的实现: 这是我启动应用程序时发生的异常(我正在使用 Spring 启动)。

  • 我环顾了这里和其他网站,但我想不出解决办法。 一切正常,直到我初始化中的。 我一直在犯这个错误 我有这个格里德尔 当我添加插件和时,它说它们找不到。 但那给了我这些错误 在数据库文件中,我做了如下操作: 并将所有东西连接到RoomViewModel(我也为它创建了一个工厂) 这是我做的 我认为上下文有问题,但我真的不知道。还在学习。。。 请帮帮忙

  • 我想要编写一个Spring Data JPA存储库接口方法签名,它将允许我查找实体中具有嵌入对象属性的实体。有没有人知道这是否可能,如果可能,如何实现?

  • 我有一个Spring Boot和嵌入式Mongo DB的项目,我也想查找存储在那里的数据。我学习了本教程https://springframework.guru/spring-boot-with-embedd-mongoDB/