gpt4 book ai didi

java - ORM 在 JPA 中同时使用两种策略映射继承?

转载 作者:行者123 更新时间:2023-12-01 14:44:46 25 4
gpt4 key购买 nike

目前,据我所知,JPA中最常用的继承映射策略有两种:

  1. 单表 - 所有类(子类和父类(super class))都映射到单个表中,该表将所有类的所有字段作为列;并且仅特定于某些子类的字段在其他相应条目中为 NULL。

.

@Entity
@Table(name="types")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="types", discriminatorType=DiscriminatorType.STRING, length=1)
public abstract class Base { //... }

@Entity
@DiscriminatorValue(value="A")
public class TypeA extends Base { //... }

@Entity
@DiscriminatorValue(value="B")
public class TypeB extends Base { //... }
  1. 连接表策略 - 其中有一个基类表,其中所有基类字段作为列,另一列用于类型;每个子类还有特定的表,每个表仅具有相应的子类字段,这些字段与基表一对一(通过 PK)映射。

.

@Entity
@Table(name="USERS")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="types",discriminatorType=STRING, length=1)
public abstract class Base { //... }

@Entity
@Table(name="SELLERS")
@DiscriminatorValue(value="A")
@PrimaryKeyJoinColumn(name="base_id")
public class TypeA extends User { //... }

@Entity
@Table(name="BIDDERS")
@DiscriminatorValue(value="B")
@PrimaryKeyJoinColumn(name="base_id")
public class TypeB extends User { //... }

在我的域中,我有这些类:

public abstract class Base {
//data
}

public class TypeA extends Base {
//only one field
}

public class TypeB extends Base {
// many more fields
}

我想要一个 1. TypeA 和 Base 之间的继承映射策略,以及 2. TypeB 和 Base 之间的继承映射策略(这是过于简单化;实际上有很多实体),因为我不希望再有另一个表 field 。这在 JPA 中可能吗?它有什么意义吗?

编辑:我不知道代码格式有什么问题......

最佳答案

不,这在 JPA 中是不可能的。您需要在基类级别配置@Inheritance,并且不能在子类级别覆盖它。

但是,您的选项确实包括您没有提到的另一种可能性,即 InheritanceType.TABLE_PER_CLASS 。如果您使用它,您将拥有 N 个表(用于 N 个子类),而不是一个或 N+1 个表。它在某些情况下效果很好,请参阅链接中的优点/缺点。

关于java - ORM 在 JPA 中同时使用两种策略映射继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551020/

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