【问题标题】:OneToOne mapping not getting child entity while selecting parent entity选择父实体时,OneToOne 映射未获取子实体
【发布时间】:2019-12-29 10:49:50
【问题描述】:

具有 OneToONEe 双向映射的 2 个表,其中父表中的列是唯一的而不是主要的,而子表中映射的列是主要的。 能够将数据保存在子表中,但是在尝试获取父实体时 子实体以 null 的形式出现

参考代码

父实体:

@Column(name="REFERENCE_NO",unique = true)
private Long referenceNo;
@OneToOne(fetch = FetchType.LAZY, mappedBy="parentObj", cascade = CascadeType.ALL)
    private ChildEntity childEntity ;

子实体:

@Id
@Column(name="REFERENCE_NO")
Long referenceNo;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="REFERENCE_NO",referencedColumnName = "REFERENCE_NO")
private ParentEntity parentObj;

【问题讨论】:

  • 如果您设置了fetch = FetchType.EAGER,则您的childEntity 为null,因为您已将fetch = FetchType.LAZY 设置为映射。如果没有必要,我认为您可以删除 fetch = FetchType.LAZY。
  • 你用的是什么休眠版本?
  • @vincenzopalazzo 我尝试删除“LAZY”同样的问题,FetchType.EAGER 也不起作用。
  • @SternK 我正在使用 5.1.0.Final
  • @RajanSharma 如果没有加载适当的childEntity,则变量不在数据库中,对吗?您可以尝试在数据库中找到它吗?如果该变量不存在,则应为childEntity 分配一个值,例如parentObj.setChild(childEntity);

标签: java hibernate hibernate-mapping one-to-one


【解决方案1】:

你应该改变你的获取类型。

@OneToOne(fetch = FetchType.EAGER)

其他选项是在您想要访问子对象时调用父对象的 getter。

【讨论】:

  • 如果这就是你的意思,我就是这么想的!查询 query=this.getEm().createQuery("select s from ParentEntity s where s.referenceNo=:refNo"); query.setParameter("refNo", refNo); return (ParentEntity)query.getSingleResult();
  • 这不是一个可靠的问题。如果要在加载时获取子元素,请更改获取类型。 createQuery 在我看来也已经过时了,我更喜欢在 Repository 界面中使用 @Query。请提供输入、示例和预期输出。
  • 在上面提到的 cmets 中,我尝试将 FetchType 更改为 eager 不起作用,最初查询是 NamedQuery (@NamedQuery(name="ParentEntity.findAll", query="SELECT v FROM ParentEntity v") ,) 只是尝试不同的东西,即使查询已经过时也不应该影响输出,所以这里的基本问题是当 ParentEntity 正在加载时为什么子实体没有加载我需要在外部指定什么来获取子实体实体加载。
  • 似乎您必须在查询中手动加入子项。 like this
  • 感谢您的输入,但这是一种解决方法,我只是想知道为什么它没有在内部发生,是因为当它尝试选择时,因为父实体的列不是主键,它无法关联子实体带有@OneToOne 的实体或我尝试使用它的主键但不能使用唯一键的其他东西!
猜你喜欢
  • 2012-05-25
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
相关资源
最近更新 更多