JPA:可以在@OneToMany上添加额外的JOIN约束

时间:2016-05-12 13:35:03

标签: java hibernate jpa

我有两张桌子' account_pools'和'帐户' ,基本上看起来像这样

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)
);

'帐户'表是历史记录,因此当用户编辑帐户时,当前行/版本标记为" deleted = true"并插入包含用户更改的新行。

应用程序层不需要了解历史记录,因此我希望我的AccountPool实体获取未删除的帐户;与

相似的东西
@Entity
public class AccountPool {

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

到目前为止,我提出了可能的解决方案:

  1. 使用@PostLoad填充&#39;帐户&#39;集合,这在将Hibernate用作JPA提供程序但违反JPA API时有效 声明实体侦听器/回调不能调用的契约 EntityManager方法(参见 https://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/listeners.html
  2. 标记&#39;帐户&#39;字段为@Transient并手动包装从数据库中获取AccountPool实例的所有方法 明确填写帐户&#39;之后的收藏
  3. 解决方案1.)有效,但违反了JPA API合同

    解决方案2.)工作但非常容易出错=每当有人添加一个从数据库中提取AccountPool实例的新方法但是忘记之后手动填充&#39;帐户集合时会中断

    我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

是的,您可以使用非JPA,Hibernate特定的 06:47 $ sdk version ==== INTERNET NOT REACHABLE! =============================== Some functionality is disabled or only partially available. If this persists, please enable the offline mode: $ sdk offline ============================================================ SDKMAN 4.0.35 注释来过滤集合。

见2.4.6.1节

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

@Where

或者,对于符合JPA的解决方案,您可以创建一个数据库视图,用于过滤已删除的项目并将@Entity public class AccountPool { @OneToMany @Where( clause = "deleted='false'" ) private List<Account> accounts; } 实体映射到该视图。