2016-05-12 68 views
1

添加額外的JOIN約束我有兩個表「account_pools」和「賬戶」,基本上是這樣看JPA:可以對@OneToMany

CREATE TABLE account_pools ( 
    pool_id bigint PRIMARY KEY 
); 

CREATE TABLE accounts ( 
    id bigint PRIMARY KEY, 
    pool_id bigint NOT NULL, 
    deleted boolean NOT NULL DEFAULT false, 
    username text NOT NULL, 
    FOREIGN KEY pool_id REFERENCES account_pools(pool_id) 
); 

「帳戶」表作爲歷史,因此用戶編輯時,一個帳戶,當前行/版本標記爲「已刪除= true」,並插入一個包含用戶更改的新行。

應用程序層不需要知道歷史記錄,所以我希望我的AccountPool實體到只有獲取未被刪除的帳戶;類似

@Entity 
public class AccountPool { 

    //...stuff 
    @OneToMany 
    @MAGIC_ANNOTATION(restriction = "deleted=false") 
    private List<Account> accounts; 
} 

可能的解決方案的東西,我想出了迄今:

  1. 使用@PostLoad填充「帳戶」集合,這個工程使用Hibernate作爲JPA提供者時,卻違反了JPA API 合同中規定的實體監聽器/回調不得調用 EntityManager的方法(見 https://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/listeners.html
  2. 選中「帳戶」字段作爲@Transient和手動換我所有的方法是取AccountPool實例從數據庫中 明確填充「帳戶」集合之後

解決方案1)工作,但違反了合同JPA

的API解決方案2)的作品,但確實是容易出錯=休息每當有人補充說一種從數據庫中提取AccountPool實例但忘記手動填充「賬戶集合」之後的新方法

我錯過了什麼嗎?

+0

順便說一句,我使用的JDK8,JPA 2.1和休眠5.1 – user2737142

回答

4

是的,您可以使用非JPA,特定於Hibernate的@Where批註來過濾集合。

,見2.4.6.1

https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

@Entity 
public class AccountPool { 

    @OneToMany 
    @Where(clause = "deleted='false'") 
    private List<Account> accounts; 
}  

或者你可以創建它過濾刪除的項目一個數據庫視圖,您Account實體映射到一個JPA標準的解決方案。

+0

非常感謝,這很好地工作! – user2737142