gpt4 book ai didi

java - 使用父类(super class) hibernate @OneToOne,仅在加入时检索父类(super class)字段

转载 作者:行者123 更新时间:2023-11-29 03:52:51 25 4
gpt4 key购买 nike

我已经使用 InheritanceType.Single_Table 和鉴别器列在 Hibernate 中映射了我的继承层次结构以区分不同的实体。父类(super class)的所有子类都将它们的字段存储到辅助表中。例如:

@MappedSuperclass
public abstract class Base
{
@Id
private String id;

@Version
private long version;
}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public class Parent extends Base
{
@Column(nullable=false)
private BigDecimal value;
}

@Entity
@DiscriminatorValue("child1")
@SecondaryTable(name = "Child1")
public class Child1 extends Parent
{
@Column(table="Child1")
private String name;
}

@Entity
@DiscriminatorValue("child2")
@SecondaryTable(name = "Child2")
public class Child2 extends Parent
{
@Column(table="Child2")
private String name2;
}

我现在有一个与父类具有@OneToOne 关系的实体。该实体只需要使用父类中的值字段。它永远不需要与 Parent 的任何子类的任何字段一起工作

@Entity
public class AnotherEntity extends Base
{
@JoinColumn(name="parentId")
@OneToOne(fetch=FetchType.Lazy, optional=true, targetEntity=Parent.class)
private Parent parent;
}

我想要发生的是,当从数据库加载到父级的关系时,只选择 Parent.class 的字段。我看到的是 Hibernate 试图加载扩展 Parent 的实体的所有属性。它还左连接所有的辅助表。这是有问题的,因为我有大约 30 个扩展 Parent 的实体。这使得获取父实体不可行,因为查询执行了 30 次连接。

例如,这是我看到的查询类型:

Hibernate: 
select
parent.id as id3_0_,
parent_.version as version3_0_,
parent.name1 as name110_3_0_,
parent.name2 as name24_3_0_,
parent.type as type3_0_
from
Parent parent0_
left outer join
Child1 parent0_2_
on parent0_.id=parent0_2_.id
left outer join
Child2 parent0_3_
on parent0_.id=parent0_3_.id

我不明白为什么 Hibernate 决定选择 Parent 的子类中定义的所有属性的超集并连接所有的辅助表?我可以理解它加入了由被引用的父级的鉴别器值定义的实体的辅助表,但除此之外我很困惑。

我的问题是,当我在 AnotherEntity 类中检索父关系时,如何实现只加载父类中的字段的要求?

谢谢。

最佳答案

辅助表通常用于将单个实体的内容映射到两个表。它不允许使用标准 JPA 注释进行延迟/选择获取。您可以使用专有的 Hibernate 注释通过单独的选择来加载它,但仅在必要时才这样做。参见 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-join :

fetch: If set to JOIN, the default, Hibernate will use an inner join to retrieve a secondary table defined by a class or its superclasses and an outer join for a secondary table defined by a subclass. If set to SELECT then Hibernate will use a sequential select for a secondary table defined on a subclass, which will be issued only if a row turns out to represent an instance of the subclass. Inner joins will still be used to retrieve a secondary defined by the class and its superclasses.

因此将 Hibernate @Table 注释的 fetch 属性设置为 SELECT 将执行您想要的操作:将发出一个附加的 select 子句从适当的辅助表中选择值。

如果你想要延迟获取,那么辅助表不是你想要的。您必须使用关联来完成。

关于java - 使用父类(super class) hibernate @OneToOne,仅在加入时检索父类(super class)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7888221/

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