如何使用spring JPA(Hibernate)映射几个表,根据类型和id引用一个表?

时间:2018-04-14 16:59:22

标签: hibernate jpa hibernate-mapping polymorphic-associations

我有一个遗留数据库设计,其中表A,B,C具有id作为主键,并且它们都与表D具有一对多关系。表D具有linkable_type和linkable_id作为这些表的连接标准,即A,B,下进行。

其中D.linkable_type =' A'和D.linkable_id = A.id

同样对于其他表也加入为 D.linkable_type =' B'和D.linkable_id = B.id D.linkable_type =' C'和D.linkable_id = C.id

我试过了

@ManyToOne
@JoinColumn(name="LINKABLE_ID", referencedColumnName="ID")
@WhereJoinTable(clause = " LINKABLE_TYPE = 'A' ")
private A a;

//bi-directional many-to-one association to TrainRoute
@ManyToOne
@JoinColumn(name="LINKABLE_ID", referencedColumnName="ID")
@WhereJoinTable(clause = " LINKABLE_TYPE = 'B' ")
private B b;

但由于同一列上的多个连接,它无法正常工作。 我也试过

@ManyToOne
@Any(metaColumn = @Column(name = "LINKABLE_TYPE"))
@AnyMetaDef(idType = "long", metaType = "string",
        metaValues = {
                @MetaValue(targetEntity = A.class, value = "A"),
                @MetaValue(targetEntity = B.class, value = "B"),
                @MetaValue(targetEntity = C.class, value = "C")
        })
@Cascade( { org.hibernate.annotations.CascadeType.ALL})
@JoinColumn(name = "LINKABLE_ID", referencedColumnName = "ID")
@JsonProperty("linkable_id")
private E e;

我创建了

    public interface E {}

并在子类A,B,C中实现,但是这并不允许在类A中包含反向关系的@oneToMany,其中Class可以包含D的列表。它没有找到任何内容并且失败

      @OneToMany
      private List<D> d;

任何人都可以帮助我如何使用Hibernate在Spring JPA中映射这些关系?

1 个答案:

答案 0 :(得分:0)

我们通过以下方法解决了这个问题: 我们将@OneToMany对象设置为@Transient,并在保存父对象之后手动保存该对象。这样,我们就拥有了可用于映射的两个键。

在获取部分,我们可以在两列上使用JPQL。