簡體   English   中英

如何使用它們的超類型對具體類進行通用 @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;
}

具體的類,如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類都引用數據庫中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM