带有Inheritance.JOINED的

时间:2018-02-09 08:03:01

标签: java spring hibernate jpa inheritance

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

基本抽象类为UserTable,具体派生类为ClientTableOwnerTable

我想要实现的是拥有一个存储库,find UserTable ClientTableOwnerTable Id Email }或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);

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

@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
}

我的实体看起来像这样。

UserTable.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
}

..和主键

UserTablePK.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
}

ClientTable.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
}

OwnerTable.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
}

现在一旦设置了实体,我需要编写一个如上所述的存储库,这里是我需要帮助的地方。我想写这样的东西。

UserTableRepository.java

Query

我实际上还没有尝试过这个,因为我想检查这是否是正确的路线,但是:我对此JOIN ClientTable会起作用持怀疑态度。因为为了检索整个子类对象,应该使用某种JOIN,问题是我不能明确地说ie。 OwnerTable因为那时我无法获取任何List<ClientTable> clients = repository.findAllClients(); 个实体。

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

更新

此外,要求是能够获取特定的子类。如下所示:

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

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

ClientTableRepository repository = // ...

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

...然后将它们称为:

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.0.3/jquery-confirm.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.0.3/jquery-confirm.min.js"></script>

JPA是否足以确定如何查找特定子类的所有实例?

1 个答案:

答案 0 :(得分:0)

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

因此,您的查询完全没问题,您将在结果列表中拥有子类的实例。

在我的一篇博文中了解有关JPA继承的更多信息:

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