gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:44:44 25 4
gpt4 key购买 nike

我有两个表 '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 来填充“accounts”集合,这在使用 Hibernate 作为 JPA 提供者时有效,但违反了 JPA API声明实体监听器/回调不得调用的契约(Contract)EntityManager 方法(参见 https://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/listeners.html )
  2. 将“accounts”字段标记为@Transient 并手动包装我从数据库中获取 AccountPool 实例的所有方法之后显式填充“帐户”集合

解决方案 1.) 有效但违反了 JPA API 契约(Contract)

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

我错过了什么吗?

最佳答案

是的,您可以使用非 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 的解决方案,您可以创建一个数据库 View 来过滤已删除的项目并将您的 Account 实体映射到该 View 。

关于java - JPA:可以在@OneToMany 上添加额外的 JOIN 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37188571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com