DTO和javax.persistence.cache.retrieveMode旁路之间的区别是什么?

DTO和javax.persistence.cache.retrieveMode旁路之间的区别是什么?,java,hibernate,jpa,Java,Hibernate,Jpa,根据hibernate文档 返回非托管实体,表示缓存将被忽略 问题:有什么区别?DTO如前所述: 。。。在进程之间传送数据的对象 所以DTO不是一个实体,所以在任何情况下都不受管理(当然,不一定可以使用实体类作为DTO),而是一个只保存数据的类 如果您只想获得数据(例如,传递到某处),则可以直接将数据查询到DTO中。同样,因为DTO不是一个实体,所以它不会被缓存,所以数据直接来自数据库。您都不能对其执行任何JPA操作 CacheRetrieveMode.BYPASS影响EntityManager

根据hibernate文档

返回非托管实体,表示缓存将被忽略

问题:有什么区别?

DTO如前所述:

。。。在进程之间传送数据的对象

所以DTO不是一个实体,所以在任何情况下都不受管理(当然,不一定可以使用实体类作为DTO),而是一个只保存数据的类

如果您只想获得数据(例如,传递到某处),则可以直接将数据查询到DTO中。同样,因为DTO不是一个实体,所以它不会被缓存,所以数据直接来自数据库。您都不能对其执行任何JPA操作

CacheRetrieveMode.BYPASS影响EntityManager在获取实体时如何使用其缓存-因此使用
查找(…)
方法。旁路将首先绕过从缓存进行搜索,并强制始终从数据库加载实体

所以这两个东西不能直接比较,因为它们是完全不同的东西。但我认为你所追求的不同之处在于:

  • CacheRetrieveMode.BYPASS在使用
    find()
  • DTOs当直接使用JPQL实例化时,本机或某些CriteriaQuery不使用EntityManager方法,如
    find(…)
    ,但这些定制查询不会生成实体,因此无论使用CacheRetrieveMode设置了什么,都不会缓存

好的,javax.persistence.cache.retrieveMode仅适用于缓存级别2,因此无法与完全不使用缓存的DTO进行比较

根据hibernate文档,DTO是一个非管理实体Nope“非管理实体”不存在于一级缓存中。它们不受管理,因此不在任何缓存中。