【问题标题】:Open JPA equivalent for Hibernate @ColumnTransformer为 Hibernate @ColumnTransformer 打开等效的 JPA
【发布时间】:2016-12-19 21:04:34
【问题描述】:

我正在将 ORM 框架从 Hibernate 切换到 OpenJPA。

在 Hibernate 中,我们可以使用 @ColumnTransformer 注释字段,如下所示。

@Column(name = "EMP_NAME", length = 4000)
@ColumnTransformer(
        read = "pgp_pub_decrypt(emp_name::bytea,dearmor('"+key1+"'))",
        write = "pgp_pub_encrypt(?, dearmor('"+key2+"'))"
)
private String empName;

如何在 OpenJPA 中做同样的事情

【问题讨论】:

  • 如果指定整个查询而不是仅转换单个列是可以接受的,则列出了here 的一些可能性。
  • 转换单列是我正在寻找的。持久化数据时也需要调用该函数。此链接显示仅供阅读的示例。

标签: java postgresql hibernate jpa openjpa


【解决方案1】:

我不确定与此相关的 OpenJPA 特定功能,但以下两种替代方案适用于所有 JPA 提供程序:

  1. 创建一个updatable view,它会执行必要的转换并将实体映射到视图而不是表。
  2. 将转换移动到中间件并将它们应用到entity lifecycle callbacks

这两种解决方案的另一个好处是,您可以保持实体不受自定义原生 SQL 的影响。

【讨论】:

  • 谢谢。我对这种方法有疑问。在我的要求中,我必须从应用程序传递加密方法的密钥。是否可以从 INSERT & SELECT 上的实体动态地将公钥和私钥传递给视图?
  • 我还尝试将转换移动到实体生命周期回调 - PrePersist。它将 postgres 函数作为字符串保存,而不是调用函数 @PrePersist @PreUpdate public void prePersist(){ this.empName = "pgp_pub_encrypt('"+this.empName+"', dearmor('"+key1+"'))"; }
  • 我正在尝试选项 1。面临挑战。一一克服。
  • @auhuman 关于将密钥传递给视图,我不确定您存储和访问这些密钥的准确程度。如果它们在数据库中,那么视图可以直接访问它们。关于生命周期方法,我的意思是从那里调用等效的加密库,而不是数据库函数,即中间件将进行加密和解密。
  • 我想在查询视图时从我的 java 应用程序中传递 privateKey 和密码短语。我创建了一个具有常规属性 + 属性(如 publicKey、privateKey 和密码短语)的实体。我还在视图上创建了一个插入规则以使用 publicKey 进行加密,它工作正常。使用从 java 服务动态传递给视图的 privateKey 和密码查询视图。 CREATE VIEW visits AS select id,visit_time,host,url,referer,pgp_pub_decrypt(comment, dearmor(**privateKey**), **passphrase**) as comment from accesslog;如何在查询时从 OpenJPA 传递它们?
猜你喜欢
  • 1970-01-01
  • 2017-10-23
  • 2011-05-12
  • 1970-01-01
  • 2015-10-21
  • 2018-08-09
  • 2020-03-23
  • 1970-01-01
  • 2017-09-08
相关资源
最近更新 更多