【问题标题】:generating database from hibernate entities从休眠实体生成数据库
【发布时间】:2016-02-16 16:23:59
【问题描述】:

我有 mysql db,我从中生成了休眠实体,现在我需要从这些实体生成内存数据库进行测试。尝试运行单元测试时出现此错误。

/*** 主] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:42102,SQLState:42S02 2016-02-16 18:10:47.864 错误 29758 --- [main] o.h.engine.jdbc.spi.SqlExceptionHelper:找不到表“tbl_all_orders”; SQL 语句: **/

db 创建失败。

这是我的测试属性文件内容:

db.driver: org.h2.Driver
db.url: jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;DATABASE_TO_UPPER=false
db.username: sa
db.password: 

hibernate.dialect: org.hibernate.dialect.H2Dialect
hibernate.show_sql: true
hibernate.format_sql: true
hibernate.hbm2ddl.auto: create
hibernate.archive.autodetection=class, hbm
entitymanager.packagesToScan: linda

【问题讨论】:

  • 根据错误,你的表在哪里命名为 tbl_all_orders?
  • 它是models包上的一个实体,是Linda的子包,在entitymanager.packagesToScan中提到:linda
  • 但是您是否创建了该表?我的猜测是您没有,所以这就是显示此错误的原因。如果你这样做了,请告诉我你创建表格的代码。 (又名:架构)
  • 为了澄清:我有 mysql db 从中生成休眠实体,现在我需要从这些实体中生成内存数据库以进行测试。我在尝试运行单元测试时遇到此错误。
  • 你用春豆吗?

标签: java hibernate jdbc spring-boot


【解决方案1】:

这是我的 h2 测试示例。你可以稍微改变一下,看看它适合你的情况。主要是您需要手动创建数据库表并让您的 config.xml 包含您的数据库。 如果您使用的是 spring,您可以手动创建 .sql 文件并创建表并让 bean 包含它。

someTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("testConfig.xml") // <-- this xml you need to include
public class PortDaoImplTest {

    private static final Logger log = Logger.getLogger(sysInfoDaoImplTest.class);

    @Autowired
    private sysInfoDaoImpl sysDao;

    @After
    public void tearDown(){
        portDao = null;
    }

    @Test
    public void testGetPort() {
        log.info("Testing getInfo(String id)...");
        SysInfo p = sysDao.getInfo("nysdin2039");
        assertNotNull(p);
    }

testConfig.xml

...xml header...                    

            <!--    h2 driver -->
        <bean id="test.dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="false" >
            <property name="driverClassName" value="org.h2.Driver" />
            <property name="url" value="jdbc:h2:mem:test_mem;DB_CLOSE_DELAY=-1;MODE=ORACLE" />
        </bean>

        <!--    datasource file -->
        <jdbc:initialize-database data-source="test.dataSource">
            <!--        table list -->
            <jdbc:script location="com/yourPath/h2/schema.sql" />
            <jdbc:script location="com/yourPath/h2/test_data.sql" />

        </jdbc:initialize-database>

        <!--    bean def -->
        <bean id="sysInfoDao" class="com.mycompanyName.sysInfoDaoImpl" >
            <property name="log" ref="test.log" />
            <property name="dataSource" ref="test.dataSource" />
        </bean>

....

h2 schema.sql 文件

drop table IF EXISTS tbl_all_orders;
CREATE TABLE tbl_all_orders
(
  your_stuff_ID     NUMBER               NOT NULL,
  your_other_column_stuff                VARCHAR2(15)    DEFAULT 
);

...相应地添加您的约束或列...

test_data.sql 文件

INSERT into tbl_all_orders
   (your_column_names... , your_other_column_names...)
VALUES
   (1, 'values',...);

【讨论】:

    【解决方案2】:

    这是我用于测试的工作配置(src/test/resources 文件夹中的 database.properties)

    # DB properties
    db.driver=org.h2.Driver
    db.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
    db.username=sa
    db.password=
    
    # Hibernate Configuration
    hibernate.dialect=org.hibernate.dialect.H2Dialect
    hibernate.show_sql=true
    
    # validate: validate the schema, makes no changes to the database.
    # update: update the schema.
    # create: creates the schema, destroying previous data.
    # create-drop: drop the schema at the end of the session.
    hibernate.hbm2ddl.auto=create
    entitymanager.packages.to.scan=abcde
    

    顺便说一句,您的单元测试不应该访问数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2015-10-30
      • 1970-01-01
      • 2016-03-26
      相关资源
      最近更新 更多