Spring JPA / Hibernate:如何在非主列上映射多态关系

时间:2018-04-15 10:40:04

标签: java hibernate hibernate-mapping

class B{
@Any(metaColumn = @Column(name = "ITEM_TYPE"))
@AnyMetaDef(idType = "long", metaType = "string",
        metaValues = {
                @MetaValue(targetEntity = A.class, value = "A")
        })
@Cascade( { org.hibernate.annotations.CascadeType.ALL})
@JoinColumn(name = "ITEM_ID")
private A a;
...
...
}

我正在尝试加入表格A和表格B where B.item_type ='A' 常量B.item_id= A.id

它在扔我

Caused by: org.hibernate.MappingException: Foreign key (FKi1uuph2wrvxtx66s7n7i1s09a:B [item_type,item_id])) must have same number of columns as the referenced primary key (A [id])

有关如何使用spring jpa和hibernate进行映射的任何帮助?

2 个答案:

答案 0 :(得分:0)

您的问题不明确,但下面可能有所帮助

加入表A和表B,其中B.item_type ='A'是常数,B.item_id = A.id。

1)B.item_type ='A':创建枚举并在查询时传递它 2)B.item_id = A.id:

让我们说它是一对多的关系。

Class B{

 @OneToMany
 @Cascade(org.hibernate.annotations.CascadeType.DETACH)
 @JoinColumns(@JoinColumn(name = "id", referencedColumnName = "item_id", insertable = false, updatable = false))
List<A> retunedList;

}

如果它是一对一的,将Annotaion更改为@onetoOne并返回类型A而不是列表。

答案 1 :(得分:0)

我能够通过另一种方法解决这个问题,我将关联实体设为@Transient,然后通过添加EntityListener类将父瞬态实体保存在父实体的@PostPersist上。