在映射超类中处理 Hibernate 持久化

Handling Hibernate Persistence in Mapped Superclass

我有一个第 22 条军规,需要一些帮助来解决我的问题。我有两个 EAR 应用程序,'Product' 和 'Manufacturer'。我还有一个 'Common' 库 jar 和一堆共享 code.To 避免循环依赖我不希望任何一个应用程序直接依赖另一个。为此,我在公共库中有我的域 classes(也称为产品和制造商)的抽象 @MappedSuperclass 版本。到目前为止一切顺利。

当我需要定义 class 之间的一些关系时,问题就来了。 Product 的子版本有一个 'primary manufacturer' 属性 定义如下:

@ManyToOne
@JoinColumn(name = "primary_mfg_id")
protected common.domain.Manufacturer primaryMfg; 

以及一系列制造商:

@ContainedIn
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "products_to_manufacturers", inverseJoinColumns = {
        @JoinColumn(name = "manufacturer_id", referencedColumnName = "id") }, joinColumns = {
                @JoinColumn(name = "product_id", referencedColumnName = "id") })
@OrderBy("name")
@AuditJoinTable(inverseJoinColumns = { @JoinColumn(name = "manufacturer_id", referencedColumnName = "id") })
protected Set<common.domain.Manufacturer> manufacturers;

如果我尝试部署它,我将收到一条错误消息,指出@ManyToOne 引用了未知的实体类型。这是有道理的, Manufacturer 是一个 MappedSuperClass 而不是一个实体。不幸的是,我想不出一种方法来解决这个问题而不会让人头疼。我可以合并父子 Manufacturer classes,但这需要我将 Manufacturer 应用程序的域模型的很大一部分移动到公共 jar 中。我可以有制造商 class 的产品特定版本,但这需要向 table 添加一个 DTYPE,这在休眠之外完全没有意义。

我觉得必须有一种更简洁的方法来构建这段代码,但我完全没有想法。任何帮助将不胜感激。

更新: 当我需要完整的对象时,我可以通过将其更改为 id 并通过实体管理器查找制造商来解决 'primaryMfg' 属性 问题。不幸的是,我无法为 'manufacturers' 属性 找到一种方法,所以我仍然卡住了。

更新二: 使用 ORM 映射解决了编译问题,但仍然存在运行时问题。这些问题超出了原始问题的范围,所以我在这里发布了另一个问题:Getting An Instance Of A Mapped Superclass With Hibernate EntityManager

原来解决方案一直盯着我看。当我查看我的 orm.xml 文件时,我碰巧注意到一些注释掉的代码,我必须在迁移期间禁用这些代码。我取消注释它,问题就消失了。对于碰巧 运行 的任何其他人,该片段是:

<entity class="com.tura.common.domain.Manufacturer" name="Manufacturer">
        <table name="manufacturers" />
</entity> 

通过在 Product 的 orm.xml 中添加,它告诉 hibernate 将父 class 视为一个实体。