当实体位于多个JAR文件中时,JPA / Hibernate映射错误

时间:2011-05-25 10:36:10

标签: java hibernate jpa

我对JPA / hibernate有一种奇怪的行为。

我有3个实体位于2个JAR中:

  • JAR A.
    • 顺序
    • OrderProduction
  • JAR B.
    • OrderProductionImpl

订单(来自JAR A):

@Entity
public class Order implements Serializable {
    @Id 
    private Long id;
    @OneToOne(mappedBy="parentOrder", cascade=CascadeType.ALL)
    private OrderProduction production;
}

OrderProduction(来自JAR A):

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class OrderProduction implements Serializable {
    @Id
    @Column(name="order_id", insertable=false, updatable=false)
    private Long id;

    @OneToOne
    @JoinColumn(name="order_id", nullable=false)
    private Order parentOrder;
}

OrderProductionImpl(来自JAR B):

@Entity
@Table(name="production_order")
public class OrderProductionImpl extends OrderProduction implements Serializable {
    @Temporal(TemporalType.TIMESTAMP)
    private Date creationDateTime;
}

这与EclipseLink(Glassfish 3.0)完美配合,但是使用Hibernate(JBoss 6),我得到:

javax.persistence.PersistenceException: [PersistenceUnit: testPU] Unable to configure EntityManagerFactory
Caused by: java.lang.ClassCastException: org.hibernate.mapping.UnionSubclass cannot be cast to org.hibernate.mapping.RootClass

但是如果将所有实体放在同一个JAR文件中,那么Hibernate就可以了。

我在单元测试或应用服务器部署中得到了相同的结果。

如何在使用hibernate时将我的实体保存在单独的JAR文件中?

  • [编辑]精度:成功映射来自JAR B的其他实体。
  • [编辑]也许是Hibernate的类加载器问题?

2 个答案:

答案 0 :(得分:0)

Hibernate配置文件要求相对于其路径引用所有实体,因此在我看来,您不能在不同的jar中分离出实体。

答案 1 :(得分:0)

您是否在persistence.xml配置文件中使用了jar文件标记?

根据JPA 2.0 Specification 8.2.1.6.3

  

可以指定一个或多个JAR文件   而是使用jar文件元素   的,或者除了映射之外   映射文件中指定的文件   元素。如果指定,这些JAR   将搜索文件以进行管理   持久化类和任何映射   在他们身上找到的元数据注释   将被处理,或者他们将被处理   使用映射注释进行映射   默认值由此定义   规格。这样的JAR文件是   指定相对于目录或   包含[82]根的jar文件   持久性单位。[83]

     

以下示例说明了   使用jar文件元素   引用额外的持久性   类。这些例子使用了   约定一个带有名字的jar文件   终止于“PUnit”包含   persistence.xml文件和那个jar   名称终止的文件   “实体”包含其他内容   持久性课程。

app.ear
lib/earEntities.jar
earRootPUnit.jar (with META-INF/persistence.xml )

persistence.xml contains:
<jar-file>lib/earEntities.jar</jar-file>

您可以在规范中看到更多示例。

我希望有所帮助。