我读到getone()是延迟加载的,findOne()会立即获取整个实体.我检查了调试日志,我甚至在我的sql server上启用了监视,看看执行了哪些语句,我发现getone()和findOne()都生成并执行相同的查询.但是当我使用getone()时,值最初为null(当然除了id).
那么有人可以告诉我,如果两种方法在数据库上执行相同的查询,为什么我要使用一个而不是另一个?我基本上是在寻找一种获取实体的方法,而不会获得它的所有子/属性.
EDIT1:
道码:
@Repository
public interface FlightDao extends JpaRepository
Debugging log findOne() vs getOne()
EDIT2:
感谢Chlebik,我能够找出问题所在.与Chlebik一样,如果您尝试访问getone()获取的实体的任何属性,则将执行完整查询.在我的情况下,我在调试时检查行为,一次移动一行,我完全忘记了调试IDE时尝试访问对象属性以进行调试(或者至少是我认为正在发生的事情),所以调试触发器完整的查询执行.我停止调试,然后检查日志,一切似乎都正常.
// 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。