Java OneTONE映射在选择父实体时未获取子实体
2个具有OneTONE双向映射的表,其中父表中的列是唯一的,而不是主表,子表中映射的列是主表。 能够在子表中保存数据,但在尝试获取父实体时 子实体为空 参考代码 母公司:Java OneTONE映射在选择父实体时未获取子实体,java,hibernate,hibernate-mapping,one-to-one,Java,Hibernate,Hibernate Mapping,One To One,2个具有OneTONE双向映射的表,其中父表中的列是唯一的,而不是主表,子表中映射的列是主表。 能够在子表中保存数据,但在尝试获取父实体时 子实体为空 参考代码 母公司: @Column(name="REFERENCE_NO",unique = true) private Long referenceNo; @OneToOne(fetch = FetchType.LAZY, mappedBy="parentObj", cascade = CascadeType.ALL) private
@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;
您应该更改提取类型
@OneToOne(fetch = FetchType.EAGER)
另一个选项是,当您想要访问子对象时,调用父对象上的getter。如果您设置了
fetch=FetchType.LAZY
,则childEntity为null,因为您已将映射设置为fetch=FetchType.EAGER
。我想你可以删除fetch=FetchType.LAZY
,如果没有必要的话。你使用的是什么hibernate版本?@vincenzopalazzo我试过删除“LAZY”这个问题,FetchType.EAGER也不起作用。@SternK我使用的是5.1.0。Final@RajanSharma如果未加载propertychildEntity
,则表示变量不在数据库中,正确的?你能在数据库里找到它吗?如果变量不存在,则应为childEntity
分配一个值,如parentObj.setChild(childEntity)如果你是这个意思的话,那就是我想要得到的!Query Query=this.getEm().createQuery(“从父实体s中选择s,其中s.referenceNo=:refNo”);query.setParameter(“refNo”,refNo);return(ParentEntity)query.getSingleResult();这不是一个可靠的问题。如果您想加载子元素,请更改fetch类型。createQuery在我看来也很过时,我更喜欢在存储库界面中使用@Query。请提供一个输入、示例和预期输出。在上面提到的注释中,我尝试将FetchType更改为Earge,但没有成功,最初的查询是一个NamedQuery(@NamedQuery(name=“ParentEntity.findAll”,query=“SELECT v FROM ParentEntity v”)),只是尝试不同的事情,此外,即使查询已过时,也不应影响输出,因此这里的基本问题是何时加载ParentEntity为什么不加载子实体?是否需要在外部指定一些内容以获取加载的子实体。似乎您必须在查询中手动加入子实体。感谢您的输入,但这是一个解决方法,我只是想知道为什么它不会在内部发生,是因为当它尝试选择时,因为父实体的列不是主键,它无法将子实体与@OneToOne或其他我尝试的主键相关联,但它不能与唯一键相关联!