2016-08-12 169 views
4

我正在將ORM框架從Hibernate切換到OpenJPA。打開JPA相當於Hibernate @ColumnTransformer

在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中

+0

如果指定整個查詢而不是隻轉換單個列是可接受的,則會列出[here](http://stackoverflow.com/a/21487061/2646526)中列出的某些可能性。 – heenenee

+0

轉換單列是我正在尋找的。持久數據時還需要調用該函數。此鏈接僅顯示僅供閱讀的示例。 – auhuman

回答

2

我不知道的與此相關的OpenJPA的具體功能,但以下兩種方式將努力爲所有JPA提供商:

  1. 創建updatable view,它執行必要的轉換並將實體映射到視圖而不是表格。
  2. 將轉換轉移到中間件並在entity lifecycle callbacks中應用它們。

這兩種解決方案的另一個好處是,您可以讓實體清理自定義本機SQL。

+0

謝謝。我對這種方法有疑問。在我的要求中,我必須從應用程序傳遞加密方法的密鑰。是否可以通過INSERT&SELECT中的實體動態地將公鑰和私鑰傳遞給視圖? – auhuman

+0

我也嘗試將轉換轉移到實體生命週期回調 - PrePersist。它持續以postgres功能串而不是調用函數的'@PrePersist \t @PreUpdate \t公共無效prePersist(){ \t \t this.empName =「pgp_pub_encrypt( ' 「+ this.empName +」',dearmor(」 「+ KEY1 +」'))「; \t}' – auhuman

+0

我正在嘗試選項1.面臨挑戰。一個接一個地克服。 – auhuman