【问题标题】:Spring JPA/ Hibernate : How to map polymorphic relation on non primary columnsSpring JPA/Hibernate:如何在非主列上映射多态关系
【发布时间】:2018-04-15 10:40:04
【问题描述】:
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 进行映射有任何帮助吗?

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:

    您的问题尚不清楚,但以下可能会有所帮助

    连接表 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;
    
    }
    

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

    【讨论】:

    • 谢谢我使用 WhereClause 有类似的方法,但是这在获取时有效,但在插入和更新时无效。
    • 如果您定义 CascadeType.ALL 而不是 DETACH,它将允许您执行所有操作。检查此以获取更多详细信息vladmihalcea.com/…
    • 同意。如果从一个表连接到另一个表作为多态,这将起作用。如果我们可以使用 WhereClause 或如您提到的将类型优先设置为枚举值。这足以满足我当前的示例。但根据您的示例, insertable=false 不允许在表连接上运行插入查询。我也在寻找像 @OneToAny@AnyToOne 这样的双向解决方案。不幸的是,目前 hibernate 不支持 @AnyToOne。 参考:[hibernate.atlassian.net/browse/HHH-4320]
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 2021-12-11
      • 2018-07-11
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多