如何使用它们的超类型制作具体 类 的通用 @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如StateA
、StateB
...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
抽象映射State
class:
@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<>();
我有一个基础摘要 class 定义如下:
@MappedSuperclass
public abstract class State implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column(name = "stateCode")
private String code;
}
具体的class如StateA
、StateB
...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
抽象映射State
class:
@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<>();