簡體   English   中英

具有Inheritance.JOINED的Spring數據存儲庫

[英]Spring Data Repository with Inheritance.JOINED

我在應用程序中設計了實體,使其遵循Hibernate的繼承策略Inheritance.JOINED

基本抽象類是UserTable ,具體派生類是ClientTableOwnerTable

我要實現的事情是擁有一個單一的存儲庫,在該存儲庫中,我可以通過IdEmail find任何UserTableClientTableOwnerTable )。 重要的要求是,一旦獲取它們就可以將其強制轉換為正確的類型,並且它們必須攜帶其特定的字段(而不僅僅是從UserTable繼承的字段)。

同樣重要的是,我應該能夠通過相同的存儲庫來持久化那些實體。 repository.save(clientTable)

所以這樣的事情應該是可能的:

UserTableRepository repository = // ...

int clientId = 3; 
int ownerId = 5;

ClientTable clientTable = (ClientTable) repository.findByUserId(clientId);
OwnerTable clientTable = (OwnerTable) repository.findByUserId(ownerId);

clientTable = (ClientTable) repository.findByEmail(clientEmail);
ownerTable = (OwnerTable) repository.findByEmail(ownerEmail);

我的實體看起來像這樣。

UserTable.java

@Entity
@Table(name = "USER")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class UserTable implements Serializable {

    @Column(name = "USER_ID", nullable = false)
    private Long userId;

    @EmbeddedId
    private UserTablePK userTablePK;

    @Column(name = "PASSWORD", nullable = false, length = 512)
    private String password;

    @Column(name = "FIRSTNAME", nullable = false, length = 256)
    private String firstName;

    // get, set
}

..和主鍵

UserTablePK.java

@Embeddable
public class UserTablePK implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "EMAIL", nullable = false, length = 256)
    private String email;

    public UserTablePK() {
    }

    public UserTablePK(String email) {
        this.email = email;
    }

    // get, set
}

ClientTable.java

@Entity
@Table(name = "CLIENT")
public class ClientTable extends UserTable implements Serializable {

    @Column(name = "SHOPING_POWER")
    private Integer shoppingPower;

    @Column(name = "SHOPPING_FREQUENCY")
    private Integer shoppingFreq;

    // get, set
}

OwnerTable.java

@Entity
@Table(name = "OWNER")
public class OwnerTable extends UserTable implements Serializable {

    @Column(name = "EFFICIENCY")
    private String efficiency;

    @Column(name = "SALARAY")
    private Integer;

    // get, set
}

現在設置了實體之后,我需要編寫一個類似於上述操作的存儲庫,在這里我需要一些幫助。 我當時想寫這樣的東西。

UserTableRepository.java

@Repository
public interface UserTableRepository extends CrudRepository<UserTable, UserTablePK> {

    @Query("SELECT e FROM UserTable e WHERE e.userTablePK.email = ?1")
    public UserTable findByEmail(String email); // if owner email, retrieve OwnerTable; if client email, retrieve ClientTable instance

    @Query("SELECT e FROM UserTable e WHERE e.userId = ?1")
    public UserTable findByUserId(Long userId); // if owner id, retrieve OwnerTable; if client id, retrieve ClientTable instance
}

我實際上還沒有嘗試過,因為我想檢查這是否是正確的方法,但是:我相當懷疑此Query是否有效。 因為要檢索整個子類對象,應使用某種JOIN,而問題是我無法明確地說出ie。 JOIN ClientTable因為那樣我將無法獲取任何OwnerTable實體。

如何實現可以從同一個存儲庫中獲取兩個子類?

UPDATE

同樣,要求是能夠獲取特定的子類。 所以像這樣:

List<ClientTable> clients = repository.findAllClients();

是否可以使用相同的存儲庫,還是應該編寫特定於子類的存儲庫? 例如。

@Repository
public interface ClientTableRepository extends CrudRepository<ClientTable, ClientTablePK> {
 // empty
}

...然后像這樣稱呼他們:

ClientTableRepository repository = // ...

List<ClientTable> clients = repository.findAll();

JPA是否足以確定如何查找特定子類的所有實例是否足夠?

您想要實現的正是JPA中繼承的工作方式。

因此,您的查詢非常好,結果列表中將包含子類的實例。

在我的一篇博客文章中了解有關JPA繼承的更多信息:

https://martinelli.ch/2018/01/04/inheritance-in-jpa/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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