2012-12-31 67 views
1

我已經安裝了我的類,如下所示。 Hibernate ddl生成2個表Admin和Customer。根據SINGLE_TABLE策略,我預計只有一個表。Hibernate繼承Single_table

@MappedSuperclass 
public abstract class BaseUser{ 
... 
} 

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public class Admin extends BaseUser{ 
... 
} 


@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public class Customer extends BaseUser{ 
@OneToMany 
private List<Order> orders; 
... 
} 

回答

-1

這似乎工作,雖然不確定爲什麼@MappedSuperclass doesnt。

@Entity 
@Inheritance 
public abstract class BaseUser{ 
... 
} 

@Entity 
public class Admin extends BaseUser{ 
... 
} 


@Entity 
public class Customer extends BaseUser{ 
@OneToMany 
private List<Order> orders; 
... 
} 
+1

我告訴過你......它與我發佈的內容基本相同(不包括默認配置)。閱讀我發佈的關於@MappedSuperclass的鏈接。它與你所追求的完全相反 - 每個子類都有一個單獨的表(每個都有超級類字段的列)。 –

+0

不,不是。我嘗試了你的建議。即使我在超類上定義它,我也無法使用@MappedSuperclass使其工作。 –

+0

這肯定是一個誤解。你問題中的代碼使用'@ MappedSuperclass',這是錯誤的。我的答案使用'@ Inheritance'(而不是'@ MappedSuperclass')來產生你需要的東西。在我對'@ MappedSuperclass'的回答中引用瞭解釋如何使用它以及爲什麼它不適合您的場景。 –

1

不,單表繼承的工作方式不同。繼承策略需要在超類上定義。請參閱JPA Wikibook以供參考。

@Entity 
@Inheritance 
@DiscriminatorColumn(name="USER_TYPE") 
@Table(name="USER") 
public abstract class BaseUser{ 
... 
} 

@Entity 
@DiscriminatorValue("A") 
public class Admin extends BaseUser{ 
... 
} 

@Entity 
@DiscriminatorValue("C") 
public class Customer extends BaseUser{ 
@OneToMany 
private List<Order> orders; 
... 
} 

請注意,根據您的數據庫,你可能會或可能不會被允許打電話給你的表USER。還有一個example for how to use @MappedSuperclass

+0

我不認爲這是真的......子類應該繼承繼承策略。在任何情況下,這也不起作用。 –