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



我有点进退两难,我需要一些帮助来控制我的头脑。我有两个EAR应用程序,"产品"one_answers"制造商"。我还有一个"公共"库,里面有一堆共享代码。为了避免循环依赖,我不希望任何一个应用程序直接依赖另一个应用程序。为此,我在公共库中有抽象的领域类(也称为Product和Manufacturer)的@MappedSuperclass版本。到目前为止一切顺利。

当我需要定义类之间的一些关系时,问题就出现了。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引用一个未知的实体类型。这是有道理的,制造商是一个MappedSuperClass而不是一个实体。不幸的是,我想不出一个不让人头疼的解决办法。我可以组合父类和子类Manufacturer,但这也要求我将Manufacturer应用程序的很大一部分域模型移到公共容器中。我可以有一个产品特定版本的制造商类,但这需要向表中添加一个DTYPE,而这个DTYPE在hibernate之外是完全没有意义的。

我觉得一定有一种更清晰的方式来构建这段代码,但是我已经没有想法了。如有任何帮助,不胜感激。

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

更新2:使用ORM映射解决了编译问题,但仍然存在运行时问题。这些问题超出了原来的问题的范围,所以我在这里发布了另一个问题:使用Hibernate EntityManager获得映射超类的实例

事实证明,解决方案一直就在我眼前。当我查看我的orm.xml文件时,我碰巧注意到一些注释掉的代码,我必须在迁移期间禁用它们。我去掉了注释,问题就解决了。对于其他碰巧遇到这种情况的人,代码片段是:

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

通过将它添加到Product的form .xml中,它告诉hibernate将父类视为实体。

最新更新