java - 在映射超类中处理 Hibernate 持久性
问题描述
我有一点点 22,我需要一些帮助来解决我的问题。我有两个 EAR 应用程序,“产品”和“制造商”。我还有一个带有一堆共享代码的“通用”库 jar。为了避免循环依赖,我不希望任何一个应用程序直接依赖另一个应用程序。为此,我在公共库中有我的域类(也称为产品和制造商)的抽象 @MappedSuperclass 版本。到现在为止还挺好。
当我需要定义类之间的一些关系时,问题就来了。Product 的子版本具有如下定义的“主要制造商”属性:
@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 而不是实体。不幸的是,我想不出一种方法来解决这个问题而不会让人头疼。我可以合并父制造商类和子制造商类,但这需要我还将制造商应用程序的域模型的很大一部分移动到公共 jar 中。我可以拥有制造商类的产品特定版本,但这需要向表中添加一个在休眠之外完全没有意义的 DTYPE。
我觉得必须有一种更简洁的方法来构造这段代码,但我完全没有想法。任何帮助,将不胜感激。
更新: 当我需要完整对象时,我可以通过将其更改为 id 并通过实体管理器查找制造商来解决“primaryMfg”属性。不幸的是,我想不出一种方法来为“制造商”的财产做到这一点,所以我仍然被困住了。
更新 2: 使用 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 将父类视为一个实体。
推荐阅读
- java - apache poi 是否与 xalan jar 有任何依赖关系?
- python - 类似于 R 的 diffr 的 python 库
- c++ - 对于 Mask RCNN 模型,较小的图像对 OpenCV 中的推理时间几乎没有影响
- javascript - e.slice 不是函数
- druid - Druid - 防止在每次 CSV 摄取时创建新分区
- scala - Spark 与 Scala:通过在每个可能对上执行函数来计算表
- laravel - Laravel Sanctum 在不创建新令牌的情况下检索 PlainTextToken
- javascript - 是否可以在没有网络访问和服务器的情况下在本地使用反应?
- python - 将集合列表转换为字典
- python - 计算没有 sklearn 的机器学习模型的准确率