如何使用它们的超类型制作具体 类 的通用 @OneToMany 映射?

How do I make a generic @OneToMany mapping of concrete classes using their super type?

我有一个基础摘要 class 定义如下:

@MappedSuperclass
public abstract class State implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column(name = "stateCode")
private String code;
}

具体的class如StateAStateB...StateZ定义如下:

@Entity
@Table(name = "stateA")
public class StateA extends State implements serializable{

}

还有一个 Region class 像这样:

@Entity
@Table(name = "region")
public class Region {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private int id;

@Column(name = " regionCode")
private String regionCode;

}

每个具体的 State classes 引用数据库中的 Region class。 但是,我正在努力在区域 class:

中进行这样的 OneToMany 映射
@OneToMany(mappedBy = "region", cascade= cascadeType.ALL)
private Set<State> state = new HashSet<>()

以及下面的ManyToOne抽象映射Stateclass:

@ManyToOne
@JoinColumn(name = "regionId")
private Region region;

但它不会工作,因为 State 是一个未映射的实体。有没有一种方法可以在 Region class 中制作具体 State 的通用映射,而不必声明每个具体 classes?

你应该改变继承策略,我建议你使用单一 table 策略,所以在我看来你应该将你的 'State' class 转换成这样:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class State implements Serializable {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private int id;
    @Column(name = "stateCode")
    private String code;
    @ManyToOne
    @JoinColumn(name = "regionId")
    private Region region;
}

我认为问题出在这里:

@OneToMany(mappedBy = "region", cascade= CascadeType.ALL)
private Set<State> state = new HashSet<>();

您不能使用@OneToMany 关联来列出 状态 class 因为它不是实体。您应该使用从 State class.

继承的实体集合

我想如果你把上面的代码改成那个代码就没问题了:

@OneToMany(mappedBy = "region", cascade= CascadeType.ALL)
private Set<StateA> state = new HashSet<>();