[英]Spring Data Repository with Inheritance.JOINED
我在應用程序中設計了實體,使其遵循Hibernate的繼承策略Inheritance.JOINED
。
基本抽象類是UserTable
,具體派生類是ClientTable
和OwnerTable
。
我要實現的事情是擁有一個單一的存儲庫,在該存儲庫中,我可以通過Id
或Email
find
任何UserTable
( ClientTable
和OwnerTable
)。 重要的要求是,一旦獲取它們就可以將其強制轉換為正確的類型,並且它們必須攜帶其特定的字段(而不僅僅是從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
實體。
如何實現可以從同一個存儲庫中獲取兩個子類?
同樣,要求是能夠獲取特定的子類。 所以像這樣:
List<ClientTable> clients = repository.findAllClients();
是否可以使用相同的存儲庫,還是應該編寫特定於子類的存儲庫? 例如。
@Repository
public interface ClientTableRepository extends CrudRepository<ClientTable, ClientTablePK> {
// empty
}
...然后像這樣稱呼他們:
ClientTableRepository repository = // ...
List<ClientTable> clients = repository.findAll();
JPA是否足以確定如何查找特定子類的所有實例是否足夠?
您想要實現的正是JPA中繼承的工作方式。
因此,您的查詢非常好,結果列表中將包含子類的實例。
在我的一篇博客文章中了解有關JPA繼承的更多信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.