pre*_*oid 8 spring hibernate jpa spring-data-jpa
我读到这getOne()是懒惰加载并立即findOne()获取整个实体.我检查调试日志,我甚至能监视我的SQL服务器上看到被执行什么语句,我发现,无论getOne()和findOne()生成和执行相同的查询.但是当我使用时,getOne()这些值最初为null(当然除了id).
那么有人可以告诉我,如果两种方法在数据库上执行相同的查询,为什么我要使用一个而不是另一个?我基本上是在寻找一种获取实体的方法,而不会获得它的所有子/属性.
EDIT1:
道码:
@Repository
public interface FlightDao extends JpaRepository<Flight, Long> {
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:
感谢Chlebik,我能够找出问题所在.像Chlebik所说,如果你试图访问由getOne()完整查询提取的实体的任何属性将被执行.在我的情况下,我在调试时检查行为,一次移动一行,我完全忘记了调试IDE时尝试访问对象属性以进行调试(或者至少是我认为正在发生的事情),所以调试触发器完整的查询执行.我停止调试,然后检查日志,一切似乎都正常.
getOne()vs findOne()(这个日志来自MySQL general_log而不是休眠.
这只是猜测,但在'纯JPA'中有一个名为getReference的EntityManager方法.它旨在检索只有ID的实体.它的用途主要是用于指示存在而无需检索整个实体.也许代码会说明更多:
// em is EntityManager
Department dept = em.getReference(Department.class, 30); // Gets only entity with ID property, rest is null
Employee emp = new Employee();
emp.setId(53);
emp.setName("Peter");
emp.setDepartment(dept);
dept.getEmployees().add(emp);
em.persist(emp);
Run Code Online (Sandbox Code Playgroud)
我假设getOne服务于同一目的.为什么生成的查询与您要求的相同?嗯,JPA圣经中的AFAIR - Mike Keith和Merrick Schincariol的Pro JPA2 - 几乎每个段落都包含"行为取决于供应商"的内容.
编辑:
我已经设置了自己的设置.最后我得出结论,如果你以任何方式干扰用getOne获取的实体(甚至去了entity.getId()),它会导致执行SQL.虽然如果您仅使用它来创建代理(例如,如上面代码中所示的关系指示符),则不会发生任何事情,也不会执行其他SQL.所以我假设在你的服务类中你用这个实体做某事(使用getter,log something),这就是为什么这两个方法的输出看起来是一样的.
ChlebikGitHub带有示例代码
SO有用的问题#1
SO有用的问题#2
| 归档时间: |
|
| 查看次数: |
21418 次 |
| 最近记录: |