相关疑难解决方法(0)

Hibernate在访问关联实体的id时生成SQL查询

我有Hibernate Entities看起来像这样(getters和setter被遗漏):

@Entity
public class EntityA {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private EntityB parent;
}

@Entity
public class EntityB extends SuperEntity {
    @OneToMany(mappedBy = "parent")
    @Fetch(FetchMode.SUBSELECT)
    @JoinColumn(name = "parent_id")
    private Set<EntityA> children;
}

@MappedSuperclass
public class SuperEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private long itemId;
}
Run Code Online (Sandbox Code Playgroud)

当我查询EntityA时,它加载正常,父关联被Hibernate代理替换(因为它是Lazy).如果我想访问父母的id,我执行以下调用:

EntityA entityA = queryForEntityA();
long parentId = entityA.getParent().getItemId();
Run Code Online (Sandbox Code Playgroud)

据我所知,调用不应该向数据库进行往返,因为Id存储在EntityA表中,并且代理应该只返回该值.但是,在我的情况下,这将生成一个SQL语句,该语句提取EntityB,然后才返回Id.

我该如何调查这个问题?导致这种错误行为的可能原因是什么?

java orm proxy hibernate lazy-loading

8
推荐指数
1
解决办法
3894
查看次数

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

我的问题的可能答案位于此处: How can I检索外键从JPA ManyToOne映射而不命中目标表?

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

该模型如下所示:实体ParentChild。表具有表的parentchild_id,因此它是典型的关系。PKchild@ManyToOne

现在的重点是,如果我获取实体,我需要在不获取实体的情况下Parent访问FK值(也称为实体)。我怎样才能做到这一点?PKChildChild

我使用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;
}
}
Run Code Online (Sandbox Code Playgroud)

我想做的是调用parent.getChild().getId() …

java hibernate jpa

5
推荐指数
1
解决办法
3931
查看次数

标签 统计

hibernate ×2

java ×2

jpa ×1

lazy-loading ×1

orm ×1

proxy ×1