gpt4 book ai didi

Hibernate 在某些情况下忽略属性

转载 作者:行者123 更新时间:2023-12-03 12:12:30 25 4
gpt4 key购买 nike

我有一个包含另一个域对象的域对象;称它们为 A 和 B。B 包含一个可能很大的 blob(图像文件)。只要我一次只处理一个 A,在 A 上有 B 就不是问题。但是,有时我会处理数千个 A,其中在 B 上携带 blob 会导致堆耗尽。当我处理这么多 A 时,我真的不需要 B。

有什么方法可以告诉 Hibernate 忽略特定调用的这个属性吗?在这种情况下,我应该让 B transient 并手动处理更新/删除吗?

现在为了解决这个问题,我使用 SQL 查询来提取我想要的所有 id,然后遍历该列表以获取每个域对象,执行我需要的操作,然后将其驱逐。

此外,我无法延迟加载 B,因为我处于 servlet 环境中,因此在大多数情况下,我的 Hibernate session 在访问属性之前已关闭。

@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
}

谢谢

最佳答案

Is there some way of telling Hibernate to ignore this property for a particular call? Should I just make B transient and deal with updating/deleting manually in this case?



一种选择是使用惰性属性获取(这需要字节码检测,请参阅文档)。所以你可以像这样映射 B:
@Entity
@Table(name="B")
public class B {
@Id
private Long id;

@Basic(fetch = FetchType.LAZY)
@Lob
private byte[] blob;

// getters and setters
}

并且,如文档所述:

You can force the usual eager fetching of properties using fetch all properties in HQL.



对于这种特殊用例,另一种选择是使用不带 B 的 A (A') 的替代版本。

引用
  • Hibernate 注释引用指南
  • 2.2.2. Mapping simple properties
  • Hibernate 核心引用指南
  • 20.1.8. Using lazy property fetching
  • 关于Hibernate 在某些情况下忽略属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4072557/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com