当前位置: 首页 > 面试题库 >

JPA + Hibernate-如何在不获取子实体的情况下获取其子实体?

华凌
2023-03-14
问题内容

但是,首选解决方案(属性访问)在我的情况下不起作用(我缺少列异常-为什么?)

该模型如下所示:实体ParentChild。表parent含有列child_idPKchild表,以便它是典型的@ManyToOne关系。

现在的问题是,如果我取Parent的实体,我需要有机会获得FK价值(亦称PKChild实体),而不取Child实体。我怎样才能做到这一点?

我使用的Annotations映射如下所示:

@Entity
@Table(name = "parent")
public class Parent extends AbstractEntity {

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "patent_id", nullable = true)
private Child child;

@Column(name="child_id",insertable=false,updatable=false)
private Integer childId;

public Child getChild() {
    return patent;
}

public void setChild(Child child) {
    this.child = child;
}


public Integer getChildId(){
    return childId;
}
}

我想做的是调用parent.getChild().getId()而无需Child从DB中额外获取实体。

根据我上面提到的答案,如果我将注释从字段移到getter(在Parent实体上,我对吗?),请求的行为将是开箱即用的。然而,当我移动注释消气,我得到一个验证异常child柱缺失(好奇,为什么childchild_id为申报?)

PS: 显示的解决方法是将一FK列声明为单独的字段,效果很好,但我认为这不是应该这样做的方法。


问题答案:

好吧,在阅读以下文章http://256stuff.com/gray/docs/misc/hibernate_lazy_field_access_annotations.shtml之后,
我意识到,属性访问应该是我要获取的属性,而不是实际的child对象。因此,将id访问权限AbstractEntity从字段更改为属性就可以了。



 类似资料:
  • 我想在单个查询中获取多个实体,因为n1查询持续时间太长。例如,SQL join查询在数据库上持续5秒,但由于N 1抓取,elcipselink持久性抓取持续50-80秒。我发现只要@ManyToOne关系被实现,LEFT JOIN FETCH就不起作用了。有人知道这个案子的左联取法吗? 请查找以下简化实体。 我就是这样取的。我已经尝试了以下所有组合,但每个组合都会对SituationData中的每

  • 我想知道是否有办法微调JPA/Hibernate以管理以下用例。我有以下对象模型: 然后我执行以下代码: 我想要实现的是: > 根据用例调整Hibernate,即不更改实体类; 使Hibernate执行两个查询: 上面的代码片段与Child-Sunder lazy fetch的基本行为是: (1)执行对实体的一个查询; (2)对实体的所有实体执行一个查询; (3)n个查询,每个实体一个。 通过阅读

  • 我有vehicleId和vehicleName的值,我想从这两个属性值中获取User对象。 我不想创建一个车辆存储库仅仅是为了找到用户对象,我知道可以通过创建一个车辆存储库来实现,它扩展了springdatajpa中的JPA存储库。

  • 我有以下三个实体: 父: 孩子: 孙子: 当我调用,我会得到一个带着孩子和孙子孙女的父母。然而,这将导致两个问题: > 无限递归因为所有实体都包含对彼此的引用。 来自Hibernate的不必要的查询,因为我的只包含

  • 问题内容: 对于每个@Entity,我需要执行以下操作: 如果该实体不存在,则持久保存该实体,并知道其是否存在。尽管我意识到这不是继承关系,但我尝试使用Entity来实现@Entity。我可以使用什么类来引用每个JPA实体?我可以只创建一个接口/抽象类MyEntities并让它们全部继承,但是这样吗?我希望更少的代码。另外,我希望能够提取每个实体的主键,就像我在.getId()中尝试的那样。 问题

  • 问题内容: 我有两个分别以双向一对多关系存在的实体类 A 和 B。 A.java: B.java 在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应