gpt4 book ai didi

hibernate - 多态 'get' 使用 hibernate、多对一、InheritanceType.JOINED

转载 作者:行者123 更新时间:2023-12-02 22:52:48 24 4
gpt4 key购买 nike

我有这样的东西..

一种汽车类别,其中有多个座位中的一个座位。 Seat 有一个子类 LeatherSeat。

public class Car {
private Seat seat;
...
@ManyToOne(fetch = FetchType.LAZY)
public Seat getSeat() {
return seat;
}
...
}

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Seat {
private String id;
private String color;
}

@Entity
public class LeatherSeat extends Seat {
private String leatherType;
}

当我创建我的汽车并将汽车座椅设为 LeatherSeat 时,它会将所有内容正确保存在数据库上。当我想要获取我的汽车(使用条件或查询列表)并且我读取 getSeat() 时,座椅始终只是一个座椅,而不是皮革座椅。我无法转换(异常(exception)),并且似乎必须通过 id 手动获取 LeatherSeat。

这是使用 JOINED 继承类型的限制还是我遗漏了一些东西。我如何获得皮革座椅的座椅?

最佳答案

在 LAZY 情况下,座位将是一个“代理”,它在实例化 Car 时实例化。那时,Hibernate 不知道座椅是否是皮革的。

当你遍历该属性,并且它被延迟加载时,Hibernate会知道Seat是皮革,但它无法追溯更改代理的类。然而,所有数据都在那里。如果您重写了任何方法,座椅将作为 LeatherSeat 进行响应。

如果您确实需要将此对象强制转换为 LeatherSeat,您可以使用 http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/engine/PersistenceContext.html#unproxy(java.lang.Object 取消代理的装箱。 )

有关为什么代理始终是 Seat 而不是 LeatherSeat 的更多信息,请参阅此博客:http://sessionfactory.blogspot.co.uk/2010/08/hacking-lazy-loaded-inheritance.html

Hibernate 文档对此进行了简要介绍:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching-proxies

关于hibernate - 多态 'get' 使用 hibernate、多对一、InheritanceType.JOINED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7823935/

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