spring – CrudRepository findOne()和JpaRepository getOne()之间的区别

前端之家收集整理的这篇文章主要介绍了spring – CrudRepository findOne()和JpaRepository getOne()之间的区别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我读到getOne()是延迟加载的,findOne()会立即获取整个实体.我检查了调试日志,我甚至在我的sql server上启用了监视,看看执行了哪些语句,我发现getOne()和findOne()都生成并执行相同的查询.但是当我使用getOne()时,值最初为null(当然除了id).

那么有人可以告诉我,如果两种方法数据库上执行相同的查询,为什么我要使用一个而不是另一个?我基本上是在寻找一种获取实体的方法,而不会获得它的所有子/属性.

EDIT1:

Entity code

道码:

@Repository
public interface FlightDao extends JpaRepository

Debugging log findOne() vs getOne()

EDIT2:

感谢Chlebik,我能够找出问题所在.与Chlebik一样,如果您尝试访问getOne()获取的实体的任何属性,则将执行完整查询.在我的情况下,我在调试时检查行为,一次移动一行,我完全忘记了调试IDE时尝试访问对象属性以进行调试(或者至少是我认为正在发生的事情),所以调试触发器完整的查询执行.我停止调试,然后检查日志,一切似乎都正常.

getOne()vs findOne()(此日志取自MysqL general_log而非hibernate.

Debugging log

No debugging 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);

我假设getOne服务于同一目的.为什么生成查询与您要求的相同?嗯,JPA圣经中的AFAIR – Mike Keith和Merrick Schincariol的Pro JPA2 – 几乎每个段落都包含“行为取决于供应商”的内容.

编辑:

我已经设置了自己的设置.最后我得出结论,如果你以任何方式干扰用getOne获取的实体(甚至去了entity.getId()),它会导致执行sql.虽然如果您仅使用它来创建代理(例如,如上面代码中所示的关系指示符),则不会发生任何事情,也不会执行其他sql.所以我假设在你的服务类中你用这个实体做某事(使用getter,log something),这就是为什么这两个方法输出看起来是一样的.

ChlebikGitHub with example code
 SO helpful question #1
 SO helpful question #2

猜你在找的Spring相关文章