有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

来自持久性的javajar文件。在eclipse中找不到xml

我的eclipse工作区中有两个maven项目。第一个项目有hibernate实体,应该在第二个项目中使用。我在第二个项目中将其作为依赖项添加为:

<dependency>
        <groupId>org.prosolo</groupId>
        <artifactId>bigdata.common</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

我禁用了工作区解析,所以,bigdata。通用-0.0.1-快照。jar列在Maven依赖项下。此外,我还配置了持久性。要导入此jar文件,请执行以下操作:

<persistence-unit name="entityManager"
    transaction-type="RESOURCE_LOCAL">      
    <jar-file>lib/bigdata.common-0.0.1-SNAPSHOT.jar</jar-file>

但是,当我从eclipse运行project时,由于以下错误,EntityManager无法初始化:

Caused by: java.lang.IllegalArgumentException: File [lib/bigdata.common-0.0.1-SNAPSHOT.jar] referenced by given URL [file:lib/bigdata.common-0.0.1-SNAPSHOT.jar] does not exist

若我从终端运行项目,或者使用绝对路径运行项目,那个么就并没有问题。jar文件,但在Eclipse中仍然存在相对路径问题。在这两种情况下,我都使用maven jetty插件来运行应用程序

我发现了这个bug报告,但似乎没有解决方案

我想知道是否有解决这个问题的方法,或者如果不能使用jar文件,我应该使用什么其他方法来使用其他项目中的hibernate实体进行包扫描

谢谢, 佐兰


共 (1) 个答案

  1. # 1 楼答案

    [编辑]这个问题已经在Hibernate 5.0.7中解决,请参见HHH-4161

    根据最近对HHH-4161的更新,这个问题也发生在Hibernate 5.0.2上,计划在Hibernate 5.0.5中解决

    在本期中,I proposed a workaround基于一个自定义扫描程序类,该类管理相对URL并将其绝对化。我将AbstractScannerImpl源代码复制到测试中。MyCustomScanner,添加了StandardScanner的构造函数,并在环境中添加了以下代码。getNonRootUrls()循环:

    if (!url.getPath().startsWith("/")) {
        // relative URL => make it processed relatively to the root URL of the META-INF/persistence.xml
        // This means that rootUrl has a META-INF directory (but the rootUrl has no META-INF in path).
        // See JPA 2.1 specification page 366-368: http://download.oracle.com/otn-pub/jcp/persistence-2_1-fr-eval-spec/JavaPersistence.pdf
        // Note: while the solution looks smart, the getNonRootUrls may include more
        // than the <jar-file>. Thus, it may have side effects.
        try {
            URL absoluteUrl = new URL(environment.getRootUrl(),url.getPath());
            url=absoluteUrl;
        } catch (MalformedURLException e) {
            throw new RuntimeException("cannot make the relative URL as absolute:"+url);
        }
    }
    

    其精神与Lauri Harpf的pull请求(https://github.com/hibernate/hibernate-orm/pull/889/files)相同,但优先权被赋予相对URL,并使用相对URL测试而不是异常捕获机制

    这种方法的风险在于,所有非根URL都以相同的方式管理,而不仅仅是<jar-file>标记的URL。因此,可能会出现副作用。 然后将自定义扫描程序添加到持久性中。xml:

    <property name="hibernate.ejb.resource_scanner" value="test.MyCustomScanner" />
    

    运行时,执行日志不会显示任何异常,只会引发一个问题,即MyEntity表不存在,这表明实体不存在。jar已正确处理:

    oct. 30, 2015 8:11:50 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
    INFO: HHH000204: Processing PersistenceUnitInfo [
        name: test-hibernate2
        ...]
    oct. 30, 2015 8:11:51 PM org.hibernate.Version logVersion
    INFO: HHH000412: Hibernate Core {5.0.2.Final}
    oct. 30, 2015 8:11:51 PM org.hibernate.cfg.Environment <clinit>
    INFO: HHH000206: hibernate.properties not found
    oct. 30, 2015 8:11:51 PM org.hibernate.cfg.Environment buildBytecodeProvider
    INFO: HHH000021: Bytecode provider name : javassist
    oct. 30, 2015 8:11:51 PM org.hibernate.boot.internal.MetadataBuilderImpl$MetadataBuildingOptionsImpl <init>
    INFO: HHH90000001: Found usage of deprecated setting for specifying Scanner [hibernate.ejb.resource_scanner]; use [hibernate.archive.scanner] instead
    oct. 30, 2015 8:11:51 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
    INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
    oct. 30, 2015 8:11:51 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
    WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
    oct. 30, 2015 8:11:51 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
    INFO: HHH000401: using driver [org.hsqldb.jdbcDriver] at URL [jdbc:hsqldb:mem:testdb]
    oct. 30, 2015 8:11:51 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
    INFO: HHH000046: Connection properties: {user=sa}
    oct. 30, 2015 8:11:51 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
    INFO: HHH000006: Autocommit mode: false
    oct. 30, 2015 8:11:51 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
    INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
    oct. 30, 2015 8:11:51 PM org.hibernate.dialect.Dialect <init>
    INFO: HHH000400: Using dialect: org.hibernate.dialect.HSQLDialect
    oct. 30, 2015 8:11:52 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
    INFO: HHH000228: Running hbm2ddl schema update
    oct. 30, 2015 8:11:52 PM org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults
    INFO: HHH000262: Table not found: MyEntity
    oct. 30, 2015 8:11:52 PM org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults
    INFO: HHH000262: Table not found: MyEntity
    

    我在前一位客户中使用的另一种解决方法是,在构建时基于应用程序类路径中JAR的依赖关系构建<class>标记列表。乍一看,它看起来有点复杂,但它对应用程序提供了很好的控制:开发人员可以查看持久性。xml来立即知道运行时将加载哪些实体类。请注意,这种方法是在2007年使用的,远远早于我考虑定制扫描仪的解决方案