【发布时间】:2020-08-23 16:29:46
【问题描述】:
在尝试使用 Hibernate 作为持久性提供程序通过 Spring 数据存储库获取实体引用时,我在处理不必要的 SQL 选择查询。
我的案例多次讨论了有关使用entityManager.getReference() 以获得刚刚初始化的id 值here 和here 的代理对象的问题。
但这并不像描述的那样工作。
我有以下环境和代码
- 带有 Hibernate 的 Spring Boot JPA 项目
- 一个死的简单实体
Foo
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "d20_foo")
public class Foo {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在我的服务代码中,我只是像这样调用getReference
@Service
@Transactional
public class MyService {
@PersistenceContext
private EntityManager entityManager;
...
public void getFooLink() {
...
Foo foo = entityManager.getReference(Foo.class,1L);
...
}
...
}
在调试模式下的休眠日志中,我看到,一旦我点击getReference,就会执行以下选择查询
Hibernate:
select
foo0_.id as id1_0_0_,
foo0_.name as name2_0_0_
from
d20_foo foo0_
where
foo0_.id=?
这是为什么呢?为什么要执行查询而不是只返回代理对象?
我没有点击任何其他字段(例如在返回的对象上调用 getName()),并且按照参考实现中的描述进行了所有操作。
我不需要额外的查询 - Foo 实体是一个只读对象,我需要它作为另一个实体的引用对象。
【问题讨论】:
标签: hibernate jpa spring-data-jpa entitymanager