JPA屬性轉換器的使用與實例解析

在Java持久化框架中,JPA(Java Persistence API)為我們提供了強大的功能來操作數據庫。其中,屬性轉換器(Attribute Converter)是一個非常實用的特性,它允許我們將實體類中的屬性類型轉換為適合存儲在數據庫中的類型。通過實現javax.persistence.AttributeConverter接口并使用@Converter注解,我們可以自定義屬性的存儲和加載方式。本文將通過一個具體的例子來詳細解析JPA屬性轉換器的使用。

一、屬性轉換器的基本概念

在JPA中,實體類的某些屬性可能無法直接映射到數據庫的某種數據類型。例如,java.io.File對象無法直接存儲為數據庫中的字符串或二進制數據。此時,屬性轉換器就可以派上用場。它允許我們將File對象轉換為字符串路徑(String類型),并在加載時將字符串路徑重新轉換為File對象。

二、實現屬性轉換器

屬性轉換器需要實現AttributeConverter接口,并重寫convertToDatabaseColumnconvertToEntityAttribute兩個方法。convertToDatabaseColumn方法用于將實體類中的屬性轉換為數據庫存儲的類型,而convertToEntityAttribute方法則用于將數據庫中的數據轉換回實體類的屬性類型。

以下是一個具體的例子:

@Converter
public class FileConverter implements AttributeConverter<File, String> {@Overridepublic String convertToDatabaseColumn(File attribute) {return attribute.getAbsolutePath(); // 將File對象轉換為絕對路徑字符串}@Overridepublic File convertToEntityAttribute(String dbData) {return new File(dbData); // 將字符串路徑重新轉換為File對象}
}

三、在實體類中使用屬性轉換器

在實體類中,我們可以通過@Convert注解來指定某個屬性使用我們定義的轉換器。以下是一個包含File屬性的Report實體類:

@Entity
public class Report {@Id@GeneratedValueprivate long id;private String description;@Convert(converter = FileConverter.class)private File file;// 省略getter和setter方法
}

四、完整示例代碼

以下是一個完整的示例代碼,展示了如何使用屬性轉換器來持久化和加載包含File屬性的Report實體。

@Entity
public class Report {@Id@GeneratedValueprivate long id;private String description;@Convert(converter = FileConverter.class)private File file;// 省略getter和setter方法
}@Converter
public class FileConverter implements AttributeConverter<File, String> {@Overridepublic String convertToDatabaseColumn(File attribute) {return attribute.getAbsolutePath();}@Overridepublic File convertToEntityAttribute(String dbData) {return new File(dbData);}
}public class ExampleMain {private static EntityManagerFactory entityManagerFactory =Persistence.createEntityManagerFactory("example-unit");public static void main(String[] args) {try {nativeQuery("Show Columns from Report");persistEntity();nativeQuery("Select * from Report");findEntity();} finally {entityManagerFactory.close();}}private static void findEntity() {EntityManager em = entityManagerFactory.createEntityManager();Report report = em.find(Report.class, 1L);System.out.println("Report loaded: " + report);em.close();}public static void persistEntity() {Report report = new Report();report.setDescription("test report");report.setFile(new File("c:/temp/report-details.txt"));System.out.println("Persisting report: " + report);EntityManager em = entityManagerFactory.createEntityManager();em.getTransaction().begin();em.persist(report);em.getTransaction().commit();em.close();}public static void nativeQuery(String s) {EntityManager em = entityManagerFactory.createEntityManager();System.out.printf("'%s'%n", s);Query query = em.createNativeQuery(s);List list = query.getResultList();for (Object o : list) {if (o instanceof Object[]) {System.out.println(Arrays.toString((Object[]) o));} else {System.out.println(o);}}em.close();}
}

五、運行結果

運行上述代碼后,我們可以看到以下輸出:

'Show Columns from Report'
[ID, BIGINT(19), NO, PRI, NULL]
[DESCRIPTION, VARCHAR(255), YES, , NULL]
[FILE, VARCHAR(255), YES, , NULL]
Persisting report: Report{id=0, description='test report', file=c:\temp\report-details.txt}
'Select * from Report'
[1, test report, c:\temp\report-details.txt]
Report loaded: Report{id=1, description='test report', file=c:\temp\report-details.txt}

從結果可以看出,File對象被成功轉換為字符串路徑并存儲在數據庫中,加載時又正確地轉換回了File對象。

六、不使用@Converter的情況

如果不使用@Converter注解,File對象將被以二進制形式存儲,這可能不是我們期望的結果。以下是不使用@Converter的情況:

@Entity
public class Report {@Id@GeneratedValueprivate long id;private String description;private File file; // 不使用@Convert注解// 省略getter和setter方法
}

運行結果如下:

'Show Columns from Report'
[ID, BIGINT(19), NO, PRI, NULL]
[DESCRIPTION, VARCHAR(255), YES, , NULL]
[FILE, VARBINARY(255), YES, , NULL]
Persisting report: Report{id=0, description='test report', file=c:\temp\report-details.txt}
'Select * from Report'
[1, test report, [B@18518ccf]
Report loaded: Report{id=1, description='test report', file=c:\temp\report-details.txt}

可以看到,File對象被存儲為二進制數據,這使得數據的可讀性變差。

七、總結

通過本文的介紹,我們了解了JPA屬性轉換器的基本概念、實現方式以及如何在實體類中使用它。屬性轉換器為我們提供了靈活的機制,可以將復雜的對象類型轉換為適合存儲在數據庫中的類型,同時也方便了數據的加載和使用。在實際開發中,合理使用屬性轉換器可以大大提高代碼的可讀性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72180.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72180.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72180.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI數據分析:用DeepSeek做數據清洗

在當今數據驅動的時代&#xff0c;數據分析已成為企業和個人決策的重要工具。隨著人工智能技術的快速發展&#xff0c;AI 驅動的數據分析工具正在改變我們處理和分析數據的方式。本文將著重介紹如何使用 DeepSeek 進行數據清洗。 數據清洗是數據分析的基礎&#xff0c;其目的是…

rust學習~tokio的io

await Suspend execution until the result of a Future is ready. 暫停執行&#xff0c;直到一個 Future 的結果就緒。 .awaiting a future will suspend the current function’s execution until the executor has run the future to completion. 對一個 Future 使用 .awa…

騰訊2025年軟件測試面試題

以下是基于騰訊等一線互聯網公司軟件測試崗位的面試趨勢和技術要求,025年出現的軟件測試面試題。這些問題涵蓋了基礎知識、自動化測試、性能測試、安全測試、編程能力等多個方面,供參考和準備。 一、基礎知識 軟件測試的基本概念

數據結構(陳越,何欽銘) 第四講 樹(中)

4.1 二叉搜索樹 4.1.1 二叉搜索樹及查找 Position Find(ElementTyoe X,BinTree BST){if(!BST){return NULL;}if(X>BST->Data){return Find(X,BST->Right)}else if(X<BST->Data){return Find(X,BST->Left)}else{return BST;} } Position IterFind(ElementTyp…

GEE學習筆記 28:基于Google Earth Engine的Landsat8纓帽變換土壤指數反演——亮度、綠度與濕度分量的提取

1.纓帽變換介紹 纓帽變換(Tasseled Cap Transformation,TCT),也稱為纓帽特征空間或纓帽系數,是一種用于遙感圖像分析的線性變換方法。它最初由美國農業部的研究人員E. Kauth和G. Thomas在1976年提出,用于增強陸地衛星(Landsat)圖像中的特定地表特征,如植被、土壤和城市…

【現代Web布局與動畫技術:卡片組件實戰分享】

&#x1f4f1; 現代Web布局與動畫技術&#xff1a;卡片組件實戰分享 &#x1f680; 引言 &#x1f31f; 在過去的開發過程中&#xff0c;我們共同實現了一個功能豐富的卡片組件&#xff0c;它不僅美觀&#xff0c;還具有交互性和響應式設計。這篇文章將分享這個組件背后的技術…

學習路之PHP --TP6異步執行功能 (無需安裝任何框架)

學習路之PHP --異步執行功能 &#xff08;無需安裝任何框架&#xff09; 簡介一、工具類二、調用三、異步任務的操作四、效果&#xff1a; 簡介 執行異步任務是一種很常見的需求&#xff0c;如批量發郵箱&#xff0c;短信等等執行耗時任務時&#xff0c;需要程序異步執行&…

STM32之影子寄存器

預分頻寄存器計數到一半的時候&#xff0c;改變預分頻值&#xff0c;此時不會立即生效&#xff0c;會等到計數完成&#xff0c;再從影子寄存器即預分頻緩沖器里裝載修改的預分頻值。 如上圖&#xff0c;第一行是內部時鐘72M&#xff0c;第二行是時鐘使能&#xff0c;高電平啟動…

Deepseek API接入IDE【VSCode Cline Cursor ChatBox Deepseek deepseek-reasoner】

本文解決以下疑難雜癥: 使用deepseek的最新接模型接入ide 使用deepseek的最新接模型接入vscode 使用deepseek的最新接模型接入vscode中的Cline 使用deepseek的最新接模型接入Cline 使用deepseek的最新接模型接入ChatBox 使用cursor接入Deepseek官方的的deepseek-reasoner…

微信小程序讀取寫入NFC文本,以及NFC直接啟動小程序指定頁面

一、微信小程序讀取NFC文本(yyy優譯小程序實現),網上有很多通過wx.getNFCAdapter方法來監聽讀取NFC卡信息,但怎么處理讀取的message文本比較難找,現用下面方法來實現,同時還解決幾個問題,1、在回調方法中this.setData不更新信息,因為this的指向問題,2、在退出頁面時,…

在Linux桌面上創建Idea啟動快捷方式

1、在桌面新建idea.desktop vim idea.desktop [Desktop Entry] EncodingUTF-8 NameIntelliJ IDEA CommentIntelliJ IDEA Exec/home/software/idea-2021/bin/idea.sh Icon/home/software/idea-2021/bin/idea.svg Terminalfalse TypeApplication CategoriesApplication;Developm…

VUE2生命周期頁面加載順序

使用 Vue CLI 4.5 運行 vue create myvue 創建項目&#xff0c;并通過 npm run serve 運行后&#xff0c;會生成一個標準的 Vue 項目目錄結構。以下是生成目錄的詳細說明&#xff0c;以及運行 localhost:8080 后 Vue 頁面的加載順序。 1. 生成目錄結構 運行 vue create myvue …

SV基礎(一):System Verilog與Verilog核心區別詳解

文章目錄 **1. 設計增強功能****數據類型擴展****接口(Interface)****2. 驗證功能增強****斷言(Assertions)****約束隨機測試****功能覆蓋率****3. 面向對象編程(OOP)****4. 測試平臺(Testbench)改進****5. 語法簡化****6. 其他關鍵區別****學習建議**System Verilog 是…

如何用 Python 進行機器學習

文章目錄 前言1. 環境準備Python安裝選擇Python開發環境安裝必要庫 2. 數據收集與加載3. 數據探索與可視化4. 數據預處理5. 模型選擇與訓練6. 模型評估7. 模型調優8. 模型部署 前言 使用 Python 進行機器學習一般可以按照以下步驟進行&#xff0c;下面將詳細介紹每個步驟及對應…

2021-05-27 C++找出矩陣數組中值最大的元素和它在數組中的位置

緣由各位大佬&#xff0c;這個應該怎么做_編程語言-CSDN問答 void 找出數組中值最大的元素和它在數組中的位置() {//緣由https://ask.csdn.net/questions/7436585?spm1005.2025.3001.5141int a[4][4], aa 0, aaa 0, d 0, x 0;while (aa < 4 && aaa < 4)std…

在 IntelliJ IDEA 中啟動多個注冊到 Nacos 的服務

使用場景&#xff1a;邊改代碼&#xff0c;邊和前端聯調。 在微服務架構中&#xff0c;服務注冊與發現是核心功能之一。Nacos 作為一款流行的開源服務注冊與配置管理工具&#xff0c;被廣泛應用于微服務架構中。本文將介紹如何在 IntelliJ IDEA 中配置并啟動多個注冊到 Nacos …

DeepSeek開源周Day2:DeepEP - 專為 MoE 模型設計的超高效 GPU 通信庫

項目地址&#xff1a;https://github.com/deepseek-ai/DeepEP 開源日歷&#xff1a;2025-02-24起 每日9AM(北京時間)更新&#xff0c;持續五天 (2/5)&#xff01; ? ? 引言 在大模型訓練中&#xff0c;混合專家模型&#xff08;Mixture-of-Experts, MoE&#xff09;因其動…

HTTP學習——————(四)TLS等加密算法

前文學習&#xff1a; 一、二、三 學習來源網站 &#xff1a; 極客時間 TLS 目的&#xff1a;身份驗證、保密性、完整性 解決問題&#xff1a; Record記錄協議——對稱加密 Handshake握手協議———1.驗證通訊雙方身份 2.交換加解密安全套件 3.協商加密參數 有密鑰交換算法…

FastExcel vs EasyExcel vs Apache POI:三者的全面對比分析

一、核心定位與歷史沿革 Apache POI&#xff08;1990s-&#xff09; 作為Java生態中最古老的Excel處理庫&#xff0c;提供對.xls/.xlsx文件的全功能支持。其核心價值在于對Excel規范的完整實現&#xff0c;包括單元格樣式、公式計算、圖表操作等深度功能。但存在內存消耗大&…

辛格迪客戶案例 | 鼎康生物電子合約系統(eSign)項目

01 案例企業 鼎康(武漢)生物醫藥有限公司于2013年06月19日成立 &#xff0c;是一家總部位于湖北武漢的CDMO公司&#xff0c;堅持以客戶為中心&#xff0c;以及時、經濟和高質量為服務導向。鼎康生物擁有先進的150,000平方英尺的生產廠房&#xff0c;生產設施位于中國武漢的Bio…