我有一个.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
@Entity
正如您所看到的,我需要查询B表的ID,但是为了做到这一点,我需要调用B表的getter,这将导致延迟加载B表本身。我不想这样做,因为我唯一需要的是获取ID,没有别的,并且该ID存在于第一个A表中。
是否有任何技巧可以帮助我在不触发新查询的情况下获取相关表的ID?
更新
A a = aRepository.findById(1);
int b_id = a.getB().getId();
答案 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
如果没有解决问题,发布实体类会有所帮助。