首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Inheritance.JOINED的春季数据仓库

基于Inheritance.JOINED的春季数据仓库
EN

Stack Overflow用户
提问于 2018-02-09 08:03:00
回答 1查看 5.3K关注 0票数 6

我设计了应用程序中的实体,以遵循Hibernate的继承策略Inheritance.JOINED

基础抽象类是UserTable,具体的派生类是ClientTableOwnerTable

我想要实现的是拥有一个单独的存储库,在其中我可以通过findEmail对任何UserTable ( ClientTableOwnerTable)进行访问。重要的要求是,一旦获取它们,就可以将它们转换为正确的类型,并且它们携带它们的特定字段(而不仅仅是从UserTable继承的字段)。

同样重要的是,我应该能够通过相同的存储库持久化这些实体。repository.save(clientTable)

所以这样的事情应该是可能的:

代码语言:javascript
复制
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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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实体。

如何实现从同一个存储库中获取两个子类?

更新

此外,需求是能够获取特定子类。所以,就像:

代码语言:javascript
复制
List<ClientTable> clients = repository.findAllClients();

是否可以使用相同的存储库,还是应该编写特定于子类的存储库?例如。

代码语言:javascript
复制
@Repository
public interface ClientTableRepository extends CrudRepository<ClientTable, ClientTablePK> {
 // empty
}

..。然后叫他们:

代码语言:javascript
复制
ClientTableRepository repository = // ...

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

这是否足以让JPA确定如何找到一个特定子类的所有实例?

EN

回答 1

Stack Overflow用户

发布于 2018-02-09 08:21:41

您想要实现的是JPA中的继承是如何工作的。

因此,您的查询非常好,结果列表中将包含子类的实例。

在我的博客文章中阅读更多关于JPA继承的信息:

https://72.services/inheritance-in-jpa/

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48701208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档