【问题标题】:JPA: Possible to add additional JOIN constraint on @OneToManyJPA:可以在 @OneToMany 上添加额外的 JOIN 约束
【发布时间】:2016-05-12 13:35:02
【问题描述】:

我有两个表 'account_pools' 和 'accounts' ,基本上是这样的

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

'accounts' 表是历史记录的,因此当用户编辑帐户时,当前行/版本会被标记为“deleted=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. 将“accounts”字段标记为@Transient 并手动包装我所有从数据库中获取 AccountPool 实例的方法到 之后明确填充“帐户”集合

解决方案 1.) 有效,但违反了 JPA API 合同

解决方案 2.) 有效,但确实容易出错 = 每当有人添加从数据库中获取 AccountPool 实例但忘记手动填充“帐户集合”的新方法时就会中断

我错过了什么吗?

【问题讨论】:

  • 顺便说一句,我正在使用 JDK8 、 JPA 2.1 和 Hibernate 5.1

标签: java hibernate jpa


【解决方案1】:

是的,您可以使用非 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;
}      

或者,对于符合 JPA 的解决方案,您可以创建一个数据库视图来过滤已删除的项目并将您的 Account 实体映射到该视图。

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多