我对JPA / hibernate有一种奇怪的行为。
我有3个实体位于2个JAR中:
订单(来自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文件中?
答案 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>
您可以在规范中看到更多示例。
我希望有所帮助。