【发布时间】: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;
}
目前我想出的可能解决方案:
- 使用@PostLoad 填充“帐户”集合,这在使用 Hibernate 作为 JPA 提供程序时有效,但违反了 JPA API 声明实体侦听器/回调不得调用的合同 EntityManager 方法(参见 https://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/listeners.html)
- 将“accounts”字段标记为@Transient 并手动包装我所有从数据库中获取 AccountPool 实例的方法到 之后明确填充“帐户”集合
解决方案 1.) 有效,但违反了 JPA API 合同
解决方案 2.) 有效,但确实容易出错 = 每当有人添加从数据库中获取 AccountPool 实例但忘记手动填充“帐户集合”的新方法时就会中断
我错过了什么吗?
【问题讨论】:
-
顺便说一句,我正在使用 JDK8 、 JPA 2.1 和 Hibernate 5.1