是否可以使用JPA和hibernate扫描jar文件中的实体

时间:2012-03-22 22:07:36

标签: hibernate jpa hibernate-mapping

我有以下情况:

  • 项目A - 包含一些实体并且是独立的
  • 项目B - 包含一些实体并且是独立的
  • 项目C - 包含很少的实体,依赖于项目A&项目B.

我正在使用Maven来管理依赖项和构建。

当我尝试测试项目A和项目B时,它会很好。它们中的每一个都有一个persistence.xml和一个单独的持久化上下文。

当我运行Project C时,它会映射任何实体。我试图使用自动检测,指定了jar文件属性......但似乎没有任何效果。

它给我一个映射异常,说明未知实体,不会持久或读取项目A或B中的实体。我已经在这里发布了3个persistence.xml文件。

另外,我尝试使用class属性并使用相同的持久化上下文,但它只是找不到文件。

非常感谢任何帮助。

提前致谢!

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
    <persistence-unit name="A" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect"/>
    <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.connection.username" value="username"/>
      <property name="hibernate.connection.password" value="password"/>
      <property name="hibernate.connection.url" value="jdbc:oracle:thin:@webdev.epi.web:1521/webdev.world"/>
      <property name="hibernate.max_fetch_depth" value="3"/>
      <property name="hibernate.archive.autodetection" value="class"/>
    </properties>

        </persistence-unit>
</persistence>

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
    <persistence-unit name="B" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect"/>
    <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.connection.username" value="username"/>
      <property name="hibernate.connection.password" value="password"/>
      <property name="hibernate.connection.url" value="jdbc:oracle:thin:@webdev.epi.web:1521/webdev.world"/>
      <property name="hibernate.max_fetch_depth" value="3"/>
      <property name="hibernate.archive.autodetection" value="class"/>
    </properties>

        </persistence-unit>
</persistence>

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
    <persistence-unit name="C" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jar-file>A-0.0.1-SNAPSHOT.jar</jar-file>
                    <jar-file>B-0.0.1-SNAPSHOT.jar</jar-file>
        <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect"/>
    <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.connection.username" value="username"/>
      <property name="hibernate.connection.password" value="password"/>
      <property name="hibernate.connection.url" value="jdbc:oracle:thin:@webdev.epi.web:1521/webdev.world"/>
      <property name="hibernate.max_fetch_depth" value="3"/>
      <property name="hibernate.archive.autodetection" value="class"/>
    </properties>

        </persistence-unit>
</persistence>

2 个答案:

答案 0 :(得分:1)

实际上,我找到了一种让它发挥作用的方法。 在项目A&amp; B,我自动检测我的实体,在Project C中,我明确地列出了映射的类,实体现在被映射并且它可以工作。

希望它可以帮助其他人!

答案 1 :(得分:0)

要在项目C中启用自动检测,您可以自己扫描类路径并以编程方式将JPA实体注册到Hibernate。因此,无需在persistence.xml中明确列出这些实体。有关详细信息,请参阅此处:https://stackoverflow.com/a/41845759/377320