【问题标题】:Unidirectional @OneToOne with @MapsId does not work with lazy loading带有@MapsId 的单向@OneToOne 不适用于延迟加载
【发布时间】:2020-06-21 03:33:49
【问题描述】:

我想使用 Hibernate 5.3.10 和 JPA 映射 @OneToOne 关联。

我知道在不使用字节码增强功能时,@OneToOne 关联的父端无法延迟加载。

在这种情况下,我只想映射客户端并使用此处建议的@MapsId 关联:Best way to map onetoone

这是我在客户端的映射。 父端CardEntity 根本没有映射到DeviceType

public class DeviceType {

    @Id
    @Column( name = "PRODUCT_CARD_TYPE_ID" )
    private Long cardTypeId;

    ...

    @OneToOne( fetch = FetchType.LAZY )
    @MapsId
    @JoinColumn( name = "PRODUCT_CARD_TYPE_ID" )
    private CardEntity card;

    ....
}

我给它一个额外的@JoinColumn,因为CardEntity 中的KEY 列的名称与"PRODUCT_CARD_TYPE_ID" 不同。 见Change Id Column

对于这个映射,LAZY 加载不起作用。它总是执行另一个语句来获取CardEntity。我在这里做错了什么?

【问题讨论】:

  • I give it an extra @JoinColumn because the KEY column in the CardEntity has a different name than "PRODUCT_CARD_TYPE_ID" - 我不清楚。 @JoinColumn 中的名称指定DeviceType 表中的外键列名称。要指定此外键列引用的列的名称,您应该使用referencedColumnName 属性。您能否分享您的 DeviceType 和 CardEntity 表的 ddl sql 以使其清楚。
  • 对不起,我认为我表达自己错了。当我不使用@JoinCOlumn 注释时,休眠使用“card_id_product_card_type_id”作为DeviceType 主键的列名。它将在 id 列前加上 card。这是修复它的方法vladmihalcea.com/…

标签: hibernate jpa-2.0 hibernate-mapping


【解决方案1】:

看起来这是HHH-12842。所描述的方法在休眠 5.4 中完美运行。但在hibernate 5.3 分支中不起作用。

【讨论】:

  • 嗯,这可能是原因。它不适用于任何一对一的关系。谢谢,我会尝试升级
  • 我有同样的问题 (stackoverflow.com/questions/61140887/…) 并迁移到 Hibernate 5.4.14.Final 但似乎仍然无法正常工作...
  • 编辑:我将代码更改为使用 @MapsId 并且效果很好,所以我猜你的也可以。
  • @Faliorn 我为hibernate 5.4测试了这个问题中描述的映射,它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多