有没有办法懒惰地获取@Embedded 字段?

Posted

技术标签:

【中文标题】有没有办法懒惰地获取@Embedded 字段?【英文标题】:Is there a way to fetch an @Embedded field lazily? 【发布时间】:2017-02-27 14:54:20 【问题描述】:

我在试图弄清楚如何设置一个具有必须延迟获取的@Embedded 字段的类时遇到了一些麻烦。我尝试使用@Basic(fetch = FetchType.LAZY) 注释该字段,但它导致持久性API 将该字段视为实现Serializable 的基本类型,因此它将该字段映射到数据库(postgresql)中的BYTEA 字段。我也在 Derby 上进行了测试,结果也是如此。

我还尝试使用@Basic(fetch = FetchType.LAZY) 单独注释@Embeddable 类的字段,而不是注释拥有它的实体的@Embedded 字段。在这种情况下,生成的架构是正确的,但是当我加载实体实例时会急切地获取字段。

我的理解是 @Basic 注释仅用于基本字段/属性,因此预计第一种情况。但是为什么@Embeddable类的字段即使被@Basic(fetch = FetchType.LAZY)注解也被急切地获取呢?另外,我知道可以通过@Basic 和关系注释指定获取策略,但是还有其他方法可以指定应该延迟获取字段吗?我正在使用 EclipseLink 2.6,但如果其他版本的 EclipseLink 或其他提供商的行为不同,请告诉我。

【问题讨论】:

【参考方案1】:

直接你不能,因为@Embedded 对象的工作方式,但是通过在对象中设置属性它应该可以工作。

@Basic(fetch=FetchType.LAZY)

请记住,lazy 应该只用于集合或大对象,并且在lazy 上设置获取类型只是提供者的一个线索,这并不意味着它总是会惰性而不是急切地获取它。

【讨论】:

以上是关于有没有办法懒惰地获取@Embedded 字段?的主要内容,如果未能解决你的问题,请参考以下文章

我如何懒惰地从Rust中的文件/流中读取多个JSON值?

RxSwift:如何使用 shareReplay 懒惰地获取订阅

没有懒惰地初始化角色集合:com.pojo.Student.phonenos,没有会话或会话被关闭

Jetpack Compose 如何为 LazyColumn 懒惰地获取音乐文件及其元数据

在将对象转换为json期间,无法懒惰地初始化角色集合

vue中第一次获取不到元素的解决办法