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 定义为字符串,让客户端创建FilePath 对象。但是直接在实体中提供这些对象要方便得多。

【问题讨论】:

【参考方案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类实现遍历本地磁盘上指定盘符或文件夹的所有的文件

Java基础之(IO流)

java io包File类

java.io.File类

执行 java.io.File 或 FileInputStream 时如何引用 OSGi 包中包含的文件

第一节:Java之文件系统操作(Java.io.File)