我设计了应用程序中的实体,以遵循Hibernate的继承策略Inheritance.JOINED。
基础抽象类是UserTable,具体的派生类是ClientTable和OwnerTable。
我想要实现的是拥有一个单独的存储库,在其中我可以通过find或Email对任何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是否能工作。因为为了检索整个子类对象,应该使用某种类型的连接,问题是我不能显式地说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确定如何找到一个特定子类的所有实例?
发布于 2018-02-09 08:21:41
您想要实现的是JPA中的继承是如何工作的。
因此,您的查询非常好,结果列表中将包含子类的实例。
在我的博客文章中阅读更多关于JPA继承的信息:
https://stackoverflow.com/questions/48701208
复制相似问题