有没有办法懒惰地获取@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 字段?的主要内容,如果未能解决你的问题,请参考以下文章
RxSwift:如何使用 shareReplay 懒惰地获取订阅
没有懒惰地初始化角色集合:com.pojo.Student.phonenos,没有会话或会话被关闭