gpt4 book ai didi

java - Hibernate 返回基类的代理

转载 作者:行者123 更新时间:2023-12-04 15:18:44 25 4
gpt4 key购买 nike

我的域模型中有一个层次结构,由类描述:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class BaseEntity {
@Id
private Long id;

// other fields
}

@DiscriminatorValue(value = "Individual")
public class IndividualEntity extends BaseEntity {
// fields
}

@DiscriminatorValue(value = "Branch")
public class BranchEntity extends BaseEntity {
// fields
}

我正在获取这样的对象:
Specification<BaseEntity> specification = createSpecification();
BaseEntity entity = baseRepository.findOne(specification);

(我正在使用 Spring 数据)

问题是 Hibernate 返回代理对象(我的理解),但代理是 BaseEntity ,不是正确的子类(它的类是 BaseEntity_$$_jvsted9_26 ,因此 entity instanceof IndividualEntity 是假的)。

有趣的是,并非所有对象都作为代理返回。
我在循环中获取实体(常见事务),其中一些以正常形式返回(即 IndividualEntity/ BranchEntity ),一些作为代理。
如果我更改机制,以便每次获取都在单独的事务中完成 - 根本不会返回代理对象。

我知道我可以解开该代理(例如 here ),但是这种行为的原因是什么(对我来说有点奇怪),我可以避免它吗?

最佳答案

如果没有看到更多的对象模型就不能确定,但​​是 Hibernate 会这样做的一个原因是 BaseEntity 已经被解析为相同 BaseEntity.id 的代理。在 session 的早些时候。

例如,如果有另一个类与 BaseEntity 有 ToOne 关系。 ,它将只有 id 的外键,所以将使用 BaseEntity_$$...代理延迟解析另一端的正确子类。这将成为该 id 的实例。在 Hibernate 中管理的 PersistenceContext .

显然是 Hibernate.unwrap() ,或者上面链接中的其他选项之一将显示“真实”实例。另一种选择是在 BaseEntity 上使用抽象方法。 (例如 isIndividual() )。这看起来有点整洁,但最终 Hibernate 仍然需要在调用方法时解析代理。

关于java - Hibernate 返回基类的代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45210987/

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