JPA 将 java.io.File 或 java.nio.file.Path 对象映射到 STRING 列
Posted
技术标签:
【中文标题】JPA 将 java.io.File 或 java.nio.file.Path 对象映射到 STRING 列【英文标题】:JPA mapping an java.io.File or java.nio.file.Path object to a STRING column 【发布时间】:2013-03-01 08:41:46 【问题描述】:假设以下实体:
@Entity
public class MyEntity
@Id
private Long id;
private File path;
private String someString;
我想映射到这样一个表:
CREATE TABLE (id BIGINT, path VARCHAR, somestring VARCHAR);
问题在于从java.io.File
(或java.nio.file.Path
)到表示文件路径的简单字符串的映射。
使用 JPA 可以进行这样的映射吗?
当然,我可以将path
定义为字符串,让客户端创建File
或Path
对象。但是直接在实体中提供这些对象要方便得多。
【问题讨论】:
【参考方案1】:问题是File
不仅仅是路径。虽然它是可序列化的,但它不会映射到 VARCHAR。如果只需要路径,则需要添加 make file.getPath() 实体的一部分和File
对象@Transient
。这样,您可以保存数据库的路径,并且在加载时仍然拥有 File
对象。
类似这样的:
@Entity
public class MyEntity
@Id
private Long id;
@Transient
private File file;
private String filePath;
private String someString;
public void setFilePath(File file)
filePath = file.getPath();
【讨论】:
虽然 File 对象不仅仅是路径,但我想要存储在数据库中的只是路径。我不想存储文件内容,因此 LOB 不适合我。 make the file.toString [...] 和 File object @transient 是什么意思?如果我将文件注释为瞬态,我如何为它定义映射? 我已经用一个例子编辑了答案,以说明我的意思。@Transient
注释阻止 JPA 尝试保留该字段。如果您担心 filePath 字段何时有效,您可以使用@PrePersist
拦截器来确保它已被填充。以上是关于JPA 将 java.io.File 或 java.nio.file.Path 对象映射到 STRING 列的主要内容,如果未能解决你的问题,请参考以下文章
利用java.io.File类实现遍历本地磁盘上指定盘符或文件夹的所有的文件