![](/img/trans.png)
[英]JPA: How do I load an entity with a Foreign Key without loading the related entity
[英]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.