Java HSQLDB和Oracle:数字类型

Java HSQLDB和Oracle:数字类型,java,oracle,hibernate,hsqldb,dbunit,Java,Oracle,Hibernate,Hsqldb,Dbunit,我们正在使用DB单元测试我们的一些类。我们的主要数据库是Oracle,但对于数据库单元,我们使用HSQLDB 我们有一个类,它有如下两个属性: @Column(columnDefinition="NUMBER(6,2)") private Double height; @Column(columnDefinition="NUMBER(6,2)") private Double weight; 这是我们的测试上下文配置类: @Configuration @EnableJpaRepositori

我们正在使用DB单元测试我们的一些类。我们的主要数据库是Oracle,但对于数据库单元,我们使用HSQLDB

我们有一个类,它有如下两个属性:

@Column(columnDefinition="NUMBER(6,2)")
private Double height;

@Column(columnDefinition="NUMBER(6,2)")
private Double weight;
这是我们的测试上下文配置类:

@Configuration
@EnableJpaRepositories(basePackages = {"com.mycompany"})
@ComponentScan(basePackages = "com.mycompany")
public class TestContextConfiguration {

    private final String DB_DRIVER = "org.hsqldb.jdbcDriver";
    private final String DB_URL = "jdbc:hsqldb:mem:test;sql.syntax‌​_ora=true";
    private final String DB_USER = "sa";
    private final String DB_PASS = "";

    private final String PACKAGES = "com.mycompany.myapp.domain";
    private final String PERSISTENCE_UNIT_NAME = "testDatabase";
    private final String PERSISTENCE_UNIT_LOCATION = "classpath:META-INF/persistence.xml";

    @Bean
    public DataSource dataSource() {
        BasicDataSource ds = new BasicDataSource();

        ds.setDriverClassName(DB_DRIVER);
        ds.setUrl(DB_URL);
        ds.setUsername(DB_USER);
        ds.setPassword(DB_PASS);
        return ds;
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();

        em.setDataSource(dataSource());
        em.setJpaDialect(new HibernateJpaDialect());
        em.setPackagesToScan(PACKAGES); 
        em.setPersistenceUnitName(PERSISTENCE_UNIT_NAME);
        em.setPersistenceXmlLocation(PERSISTENCE_UNIT_LOCATION);
        em.setJpaProperties(jpaProperties());
        em.afterPropertiesSet();
        return em.getObject();
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager tm = new JpaTransactionManager();
        tm.setEntityManagerFactory(entityManagerFactory());
        return tm;
    }

    public Properties jpaProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.HashtableCacheProvider");
        return properties;
    }

}
这是其中一项测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestContextConfiguration.class})
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
        DbUnitTestExecutionListener.class,
        TransactionalTestExecutionListener.class })
public class GestionUsuarioServiceDbunitTest {

    @Autowired
    private UserServiceImpl userService;

    @Test
    @DatabaseSetup("/META-INF/dataset-test.xml")
    public void testFindByLogin() throws Exception {

        User user = userService.findByLogin("admin");

        assertEquals("Admin", user.getNombre());
    }
}
当我们运行它时,会出现以下错误:

Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: NUMBER
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.ParserDQL.readTypeDefinition(Unknown Source)
    at org.hsqldb.ParserDDL.readColumnDefinitionOrNull(Unknown Source)
    at org.hsqldb.ParserDDL.compileCreateTableBody(Unknown Source)
    at org.hsqldb.ParserDDL.compileCreateTable(Unknown Source)
    at org.hsqldb.ParserDDL.compileCreate(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
    at org.hsqldb.Session.executeDirectStatement(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 110 more
注意,我已经告诉了DB sql.syntax‌​_真的


这里发生了什么?

另一个很好的例子,为什么使用不同的DBMS进行测试和生产不是一个好主意。为什么让混淆层(又称ORM)创建表也不是一个好主意。是的,这很明显,但这不是我的要求。我只是在寻找解决我们现在问题的办法。我们现在遇到的问题就是我正在描述的问题。如果您尝试在列定义中使用
@Column(precision=6,scale=2)
,而不是
@Column(columnDefinition=“NUMBER(6,2))“
?即可移植的JPA语法,而不是本机Oracle语法。堆栈跟踪表明未使用sql.syntax\u ora。您需要使用最新的HSQLDB版本(2.3.4)。版本2.0.0不支持语法兼容模式。Oracle中列的数据类型是什么?也许是数字(6,2)?这将映射到一个BigDecimal,而不是默认情况下的Double。