【问题标题】:Make hibernate point to the same DB connection as DBUnit使休眠指向与 DBUnit 相同的数据库连接
【发布时间】:2016-05-17 14:06:59
【问题描述】:

我正在使用 hiberante jpa 连接到 mysql 数据库。

persistence.xml 中的持久性单元如下所示:

<persistence-unit name="inventoryManager">          

        <!--some settings-->

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/inventory?useSSL=false&amp;useUnicode=true&amp;useJDBCCompliantTimezoneS‌​hift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="1234"/>

            <!--Hibernate properties-->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.hbm2ddl.auto" value="validate"/>
        </properties>
    </persistence-unit>

我的 DAO 正在使用此连接来执行数据库的所有操作。

我也在使用 DBUnit 进行测试,但我使用的是内存数据库 (hsql)。它在我的测试用例构造函数中的配置如下所示:

       System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, "org.hsqldb.jdbcDriver" );
       System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, "jdbc:hsqldb:mem:db" );
       System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "sa" );
       System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, "" );
       System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA, "db" ); 

所以当我运行一个调用一个 DAO 的测试时。 DAO 实例化一个 entityManager,它指向 persistence.xml 中指定的 mysql 连接

问题是:如何使 DAO 中的 entityManager 指向我的内存数据库?

提前致谢!

【问题讨论】:

  • 我假设您没有使用 Spring?马文呢?
  • 我没有使用 spring.. Maven 我是
  • 尝试使用相关值在 src/test/resources/META-INF 下创建第二个 persistence.xml。当测试运行时,src/test 下的资源应该优先。
  • 有效!当你知道该怎么做时很容易..非常感谢艾伦..
  • 还有其他东西.. 对于我的数据库控制.. 我正在使用 liquibase.. 但在测试的情况下,我只是通过休眠注释自动生成模式.. 它可以工作,但是似乎不正确..你知道是否有办法在这个内存数据库中运行我的 liquibase 更改日志?

标签: mysql hibernate hsqldb dbunit


【解决方案1】:

由于您不使用 Spring,您可以尝试基于 Maven 的解决方案。这涉及在 src/test/resources/META-INF 下创建一个具有相关属性的单独的 persistence.xml。

运行测试时,这个 persistence.xml 应该优先于 src/main/resources 中的那个。

【讨论】:

    【解决方案2】:

    您可以执行以下操作:

    1.创建一个指向 In Memory DB 的数据源 bean,如下所示

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="org.hsqldb.jdbc.JDBCDriver" /> <property name="jdbcUrl" value="jdbc:hsqldb:file:/data/data.db" /> </bean>

    2.定义一个EntityManagerFactory,它将引用这个DataSource。

    3.在 testConfig.xml 中添加这两个 bean

    4.使用 JUnit 运行

        @RunWith(SpringJUnit4ClassRunner.class)
        @ContextConfiguration(locations ={ "testconfig.xml" })
    

    【讨论】:

    • 他在哪里提到他正在使用 Spring?
    • 是的,我错误地忽略了它,他没有使用 Spring。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2016-02-02
    相关资源
    最近更新 更多