2017-04-05 129 views
0

如果這個問題在這裏出現,我肯定找不到它,或者它沒有特別幫助我。選擇繼承策略 - 休眠

我讀過一些教程和一些關於繼承映射的問題,這些問題無法解決我的問題。

說我有一個抽象類:

用戶

而3多個其他子類:

用戶A,用戶B,用戶C

那些所有延伸用戶。

每個子類都有自己的表,超類User,與此同時,沒有。

在我的其他類Website我有一個ArrayList,或者我應該說用戶集合。

該列表應提取Website的所有用戶。

我應該使用哪種策略?我想到了MappedSuperclass,但是因爲在我的Website類中,List是User類型的,所以我不確定這裏要做什麼。

感謝您的幫助!

+0

'每個子類都有自己的表,超類用戶,同時,不會。「要小心這一點,超類中的所有這些常見字段可能會在每個子類表中重複出現,這可能會導致不一致以及重複。考慮重新思考方法,併爲超類設置表格,然後爲更具體的擴展數據添加附加表格 – Jimmy

+0

@Jimmy我的想法籠罩於普通領域,並不是太多。無論如何,我counclnt改變結構,因爲它是一個現有的數據庫。什麼是你最好的解決方案?謝謝 ! –

回答

1

使用JPA Java實現總是取決於您自己的偏好和要求,有時候這是一個選擇的問題。

是的,@MappedSuperclass會做。 您可以讓每個孩子都與網站建立單向關係。然後你會在你的User類中有一個Website對象(帶有一堆註釋),它將映射到一個數據庫作爲foreign_key字段(假設你正在使用SQL存儲和'JPA的'Repositories'DAO抽象)。

沒有必要在網站類中存儲一組用戶。想想如果你真的需要它 - 支持一致性可能是一團糟。 但有些情況下您需要雙向關係。當你將對象存儲在內存中時(例如爲了緩存目的),你可能需要擁有這個集合。在這種情況下,爲什麼不有'用戶'集合?您將通過專用存儲庫獲取數據(或者即使您沒有使用這些存儲庫,任何其他方式都將使用帶有foreign_key的'用戶'表格,而不是'網站'表格)。

因此,例如使用Spring Data JPA,您可以在超類中定義單向關係,並使用下一個「存儲庫」(以及雙向示例,您可以在互聯網中的任何地方找到,所以我不提供它) :

@Entity 
public class SuperUser extends User { 
    ... 
} 

@Entity 
public class BasicUser extends User { 
    ... 
} 

@MappedSuperclass 
public abstract class User implements Serializable {  

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "website_uuid", nullable = false) 
    protected Website website; 

    ... 
} 

@Entity 
public class Website implements Serializable { 

    ... 
} 


@Repository 
public interface SuperUserRepository extends CrudRepository<SuperUser, Long> { 

    Iterable<SuperUser> findByWebsite(Website website); 

} 

@Repository 
public interface BasicUserRepository extends CrudRepository<BasicUser, Long> { 

    Iterable<BasicUser> findByWebsite(Website website); 

} 
+0

謝謝!我會在今天晚些時候嘗試! –

1

你要求的東西似乎是一個典型的「每個具體類別表」繼承策略。 https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#entity-inheritance-table-per-class

在舊版本的用戶指南中,它提到單獨的表格將被映射爲每個非抽象類。在最新的文件中,「非抽象」部分沒有提及,但我相信它仍然有相似的作用。

所以它看起來是這樣的:

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
abstract class User {...} 

@Entity 
class UserA extends User {...} 

@Entity 
class UserB extends User {...} 

@Entity 
class UserC extends User {...} 

但你應該意識到這個繼承策略通常給低效查詢作爲在內部它使用union

+0

嗨,感謝您的回答,但我認爲這可能無法正常工作,因爲我沒有超類的表。 –

+0

這就是我提到的:在舊的(hibernate 3.3)文檔中,它提到了單獨的表格用於每個具體(非抽象)類。所以你不需要爲你的抽象超類表。不知道行爲是否改變了。 –