我有一个包含另一个域对象的域对象; 称它们为A和B. B包含一个可能很大的blob(图像文件).只要我在A上只处理A一个A就不是一个问题.但是,有时我会处理成千上万的A,其中携带B上的blob会导致堆耗尽.当我处理这么多人工智能时,我真的不需要B.
有没有办法告诉Hibernate忽略特定调用的这个属性?在这种情况下,我应该只做B瞬态并手动处理更新/删除吗?
现在为了解决这个问题,我使用SQL查询来提取我想要的所有ID,然后遍历该列表,将每个域对象取出,执行我需要的操作,然后逐出它.
另外,我不能延迟加载B,因为我在servlet环境中,因此在大多数情况下访问属性之前我的Hibernate会话已关闭.
@Entity @Table(name="A") public class A { private Long id @OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true) @JoinColumn(name = "a_id", referencedColumnName = "b_id", nullable = true) @NotFound(action = NotFoundAction.IGNORE) private B b ...getters and setters } @Entity @Table(name="B") public class B { private Long id; private byte[] blob; ...getters and setters }
谢谢
有没有办法告诉Hibernate忽略特定调用的这个属性?在这种情况下,我应该只做B瞬态并手动处理更新/删除吗?
一种选择是使用延迟属性获取(这需要字节码检测,请参阅文档).所以你可以像这样映射B:
@Entity @Table(name="B") public class B { @Id private Long id; @Basic(fetch = FetchType.LAZY) @Lob private byte[] blob; // getters and setters }
并且,如记录:
您可以
fetch all properties
在HQL中强制使用通常的热切提取属性.
对于这个特殊用例,另一种选择是使用不带B的替代版本的A(A').
Hibernate Annotations参考指南
2.2.2.映射简单属性
Hibernate核心参考指南
20.1.8.使用lazy属性获取