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

时间:2016-03-19 17:45:53

标签: java spring jpa spring-data-jpa

我有一个.nav { padding-left: 0; margin-bottom: 0; list-style: none; text-align: center; } .nav-pills>li { float: none !important; display: inline-block; } A,它使用OneToOne关系引用另一个实体B.我使用spring数据JpaRepository

获取实体A.
@Entity

正如您所看到的,我需要查询B表的ID,但是为了做到这一点,我需要调用B表的getter,这将导致延迟加载B表本身。我不想这样做,因为我唯一需要的是获取ID,没有别的,并且该ID存在于第一个A表中。

是否有任何技巧可以帮助我在不触发新查询的情况下获取相关表的ID?

更新

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

1 个答案:

答案 0 :(得分:2)

我怀疑,在没有查看实体映射的情况下,您的实体类可能正在使用hibernate annotations on the field。如果您在实体上调用a.getB().getId()中的getId()方法,则会导致初始化代理(即B对象)并命中数据库以获取它。

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

查看HHH-3718

上的相关错误

因此,尝试使用property / getter AccessType而不是字段访问。作为示例,而不是将注释放在字段

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

将它们放在吸气剂上

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

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

此行为已经存在相关的bug HHH-3718

hibernate论坛上关于字段与属性访问类型的相关主题可能对您有用Field Vs Property access

如果没有解决问题,发布实体类会有所帮助。