2012-07-08 119 views
0

我使用SINGLE_TABLE繼承startegy來映射我的usres(請參閱代碼示例波紋管)。JPA繼承:將派生實體映射到不同表

有沒有一種方法來映射UnActiveRegularUserUnActiveBusinessUser「ACTIVE_USERS」表到另一個表,例如「UNACTIVE_USERS」並保持繼承startegy?

注:

-The這裏點是爲了避免前之間代碼重複。 RegularUser Vs UnActiveRegularUser(因爲它們使用相同的屬性),但仍然將它們映射到2個不同的表格:「ACTIVE_USERS」和「UNACTIVE_USERS」。

-strategy = InheritanceType.SINGLE_TABLE不應該改變。

- 可以添加另一個抽象層來解決這個問題嗎?

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@Table(name = "ACTIVE_USERS") 
public class User { 
    @Id @GeneratedValue 
    protected Long id; 

    @Column(nullable = false) 
    protected String name; 
} 


@Entity 
public class RegularUser extends User{ 
//more getters and settres 
} 

@Entity 
public class UnActiveRegularUser extends User{ 
//same getters and setters as in RegularUser 
} 

@Entity 
public class BusinessUser extends User { 
//more getters and settres 
} 

@Entity 
public class UnActiveBusinessUser extends User { 
//same getters and setters as in BusinessUser 
} 

感謝, 彌敦道

回答

0

堅持場到另一個表並不能防止代碼重複。我認爲你應該只是延長UnActiveBusinessUser延伸BusinessUserUnactiveRegularUser延伸RegularUser

請注意,如果用戶可能變爲無效(即它是一個RegularUser併成爲UnactiveRegularUser),繼承不是正確的解決方案:對象不能從一種類型轉到另一種類型。因爲看起來UnactiveRegularUser沒有比RegularUser更多的東西,所以我不確定這個子類是否有用。

+0

我把RegularUser和UnActiveRegularUser分隔爲2個實體,據我所知,原因是你不能將1個實體映射到2個不同的列。你提出的遺傳風格問題(例如,UnActiveBusinessUser擴展BusinessUser)是因爲他們會仍然被映射到@Table(name =「ACTIVE_USERS」)...有沒有一種方法來分離映射? – user1062078 2012-07-08 09:46:02

+0

我真的不明白你想要什麼。您希望保留繼承策略(所有實體都映射到單個表),但您也希望將實體映射到多個表。這是矛盾的。 – 2012-07-08 09:49:51

+0

我想將RegularUser&BusinessUser映射到「ACTIVE_USERS」,UnActiveRegularUser&UnActiveBusinessUser映射到「UNACTIVE_USERS」表。我使用繼承來避免實體定義級別的代碼重複,但問題是所有實體仍然只映射到「 ACTIVE_USERS「表... – user1062078 2012-07-08 10:05:39