处理映射超类中的 Hibernate 持久性

时间:2021-02-02 21:26:44

标签: java hibernate persistence

我有一点疑问,我需要一些帮助来解决问题。我有两个 EAR 应用程序,“产品”和“制造商”。我还有一个带有一堆共享代码的“通用”库 jar。为了避免循环依赖,我不希望任何一个应用程序直接依赖另一个。为此,我在公共库中有我的域类(也称为产品和制造商)的抽象 @MappedSuperclass 版本。到目前为止一切顺利。

当我需要定义类之间的一些关系时,问题就来了。产品的子版本具有如下定义的“主要制造商”属性:

@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 引用了一个未知的实体类型。这是有道理的,制造商是一个 MappedSuperClass 而不是实体。不幸的是,我想不出一种方法来解决这个问题而不会带来很大的麻烦。我可以组合父类和子制造商类,但这需要我还将制造商应用程序的域模型的很大一部分移动到公共 jar 中。我可以有一个制造商类的产品特定版本,但这需要向表中添加一个 DTYPE,这在休眠之外完全没有意义。

我觉得必须有一种更简洁的方式来组织这段代码,但我已经没有想法了。任何帮助将不胜感激。

更新: 当我需要完整对象时,我能够通过将其更改为 id 并通过实体管理器查找制造商来解决“primaryMfg”属性。不幸的是,我无法找到一种方法来为“制造商”财产做到这一点,所以我仍然被困住了。

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

1 个答案:

答案 0 :(得分:0)

事实证明,解决方案一直盯着我的脸。当我查看我的 orm.xml 文件时,我碰巧注意到一些注释掉的代码,我必须在迁移过程中禁用这些代码。我取消了它的注释,问题就消失了。对于碰巧遇到此问题的任何其他人,代码片段是:

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

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

相关问题