【问题标题】:Class autodetection in persistence.xml from src/test来自 src/test 的 persistence.xml 中的类自动检测
【发布时间】:2016-04-02 14:04:56
【问题描述】:

我在 src/main/resources/META-INF/ 有一个 persistence.xml,在 src/test/... 有另一个,它们的区别仅在于数据库的值:

  <properties>
      <property name="hibernate.archive.autodetection" value="class, hbm"/>          
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost/lanchecker-prod" />

和:

  <properties>
      <property name="hibernate.archive.autodetection" value="class, hbm"/>          
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost/lanchecker-test" />

不过,我也在使用类自动检测,它对主资源工作正常,但在我使用测试资源时失败。

有什么方法可以让它工作还是我必须使用明确的类命名?

编辑:

链接的建议实际上不起作用,它需要将项目构建为 .jar 并进行测试。就我而言,我正在尝试在 Eclipse 下进行测试,它可以解析 src/test/resources/META-INF/ 位置。

我尝试添加:

<jar-file>${PROJECT_LOC}/src/main/java/biz/ianw/lanchecker/</jar-file>

但这导致:

Exception in thread "main" java.lang.ExceptionInInitializerError
...
Caused by: javax.persistence.PersistenceException: Unable to build entity manager factory
... 
Caused by: java.lang.IllegalArgumentException: Unable to visit JAR file:${PROJECT_LOC}/src/main/java/biz/ianw/lanchecker/. Cause: Illegal character in opaque part at index 6: file:${PROJECT_LOC}/src/main/java/biz/ianw/lanchecker/

然后:

<jar-file>C:\Users\Ian\git\LANchecker\src\main\java\biz\ianw\lanchecker\</jar-file>

通过了实体管理器工厂启动,但后来仍然失败:

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: RouteCabinFares is not mapped [select rcf from RouteCabinFares rcf]

(RouteCabinFares 是我尝试自动定位的类之一)。

也许这种技术只能用于在 jar 文件中自动定位?

【问题讨论】:

  • 看起来就是这样,谢谢。没找到,我的错。我应该删除这个问题吗?
  • 很高兴有帮助。不要担心这个问题,我将其标记为重复。管理员将决定是否删除它。
  • 嗨@Nicholas。事实证明这毕竟行不通。我已经在上面解释了原因。
  • 好吧,抱歉,我不确定。我刚刚进行了快速搜索以获取上述链接。我使用 arquillian 来测试一个 Web 项目,它能够构建一个用于测试的 war 文件。也许这样的事情会有所帮助,否则,我不知道。

标签: java jpa persistence.xml


【解决方案1】:

据我所知,我在这里尝试做的事情是不可能的。

我想出的最好的解决方法是从persistence.xml中删除你希望改变的属性,在这种情况下:

<property name="hibernate.connection.url" value="jdbc:mysql://localhost/lanchecker-test" />   

并在运行时使用类似于以下的代码指定它们:

Properties properties = new Properties();
properties.setProperty("hibernate.connection.url", "jdbc:mysql://localhost/lanchecker-test");  
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("lanchecker", properties);

然后可以在运行时通过 Spring 注入实际的属性值。这涉及将标准属性分离到persistence.xml 中,并将不同的属性分离到spring.xml 中,在我看来,这非常做作。

我的印象是 Spring Boot 可能会提供一个更简单的解决方案,但会牺牲另一个框架,因此,目前,以上就是我想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 2018-01-22
    • 2017-03-17
    • 1970-01-01
    • 2013-03-26
    • 2016-07-18
    • 2012-10-03
    • 2020-01-01
    相关资源
    最近更新 更多