[英]How does Hibernate find the generic type of a collection in a @OneToMany mapping?
[英]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;
}
具體的類,如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
類都引用數據庫中的Region
class。 但是,我正在努力在 class 區域中進行這樣的OneToMany
映射:
@OneToMany(mappedBy = "region", cascade= cascadeType.ALL)
private Set<State> state = new HashSet<>()
以及抽象State
class 中的以下ManyToOne
映射:
@ManyToOne
@JoinColumn(name = "regionId")
private Region region;
但它不起作用,因為State
是一個未映射的實體。 有沒有一種方法可以在 class Region
中對具體State
進行通用映射,而無需聲明每個具體類?
您無法在 class java 中定義 jpa 注釋,因為它不是 Entity ZA261DZ21AC29EB4 您應該改用 inheritance 策略,我建議您使用單表策略,因此我認為您應該將“狀態” 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 關聯到 State class 的元素,因為它不是實體。 您應該使用從 State class 繼承的實體集合。
如果您將上面的代碼更改為該代碼,我認為您的代碼會很好:
@OneToMany(mappedBy = "region", cascade= CascadeType.ALL)
private Set<StateA> state = new HashSet<>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.