繁体   English   中英

Spring Data JPA获取实体外键而不会导致从属实体延迟加载

[英]Spring Data JPA get entity foreign key without causing the dependent entity lazy load

我有一个@Entity A,它使用OneToOne关系船引用了另一个实体B。 我使用弹簧数据JpaRepository获取实体A

A a = aRepository.findById(1);
int b_id = a.getB().getId();

如您所见,我需要查询B表的ID,但是为此,我需要调用B表的getter,这将导致B表本身的延迟加载。 我不想这样做,因为我唯一需要的就是获取ID,别无其他,并且该ID存在于第一个A表中。

有什么技巧可以帮助我在不触发新查询的情况下获取依赖表的ID?

UPDATE

@Entity
class A {
    @Id
    private Long id;

    @OneToOne
    private B b;
}

@Entity
class {
    @Id
    private Long id;
}

我怀疑,如果不查看实体映射,您的实体类可能hibernate annotations on the field使用了hibernate annotations on the field 这样,即使您像在实体上的a.getB().getId()那样调用getId()方法,也会导致初始化代理(即B对象)并访问数据库以获取它。

因此,如果仅是获取实体的id ,则可以将休眠annotations on the getter methods 这不会初始化代理(B对象)以返回id 尽管访问除id以外的任何属性都将导致命中数据库。

看看HHH-3718的相关错误

因此,请尝试使用属性/获取器AccessType而不是字段访问。 作为示例,而不是将注释放在字段上

@Id
@GeneratedValue(...)
private long id;

将它们放在吸气剂上

@Id
@GeneratedValue(...)
public long getId() { ... }

确保对B实体的所有字段进行类似的更改。 虽然您可以稍后探索@Access(AccessType.PROPERTY/FIELD)

有关此行为,已经有一个相关的错误HHH-3718

而对于现场VS属性访问类型可能是你的兴趣在休眠论坛相关主题的现场Vs的属性访问

如果不能解决问题,则发布您的实体类将有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM