Hibernate映射异常无法确定以下类型:java.nio.file.Path

时间:2018-11-07 23:40:42

标签: java hibernate

我有一个实体照片,如下所示

@Entity
class Photo {

Path imagePath;

public Path getImagePath(){
return imagePath;
// setter
}

在这个实体中,我必须nio.Path我该如何解决这个问题或使db中的表接受字符串作为路径 错误堆栈低于

Caused by: org.hibernate.MappingException: Could not determine type for: java.nio.file.Path, at table: photo, for columns: [org.hibernate.mapping.Column(image_path)]
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:431)

2 个答案:

答案 0 :(得分:3)

您可以使用AttributeConverter

import java.nio.file.Path;
import java.nio.file.Paths;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter // may want to set autoApply to true
public class PathConverter implements AttributeConverter<Path, String> {

    @Override
    public String convertToDatabaseColumn(Path attribute) {
        return attribute == null ? null : attribute.toString();
    }

    @Override
    public Path convertToEntityAttribute(String dbData) {
        return dbData == null ? null : Paths.get(dbData);
    }

}

此转换器示例将仅存储Path的路径部分。它不会保留任何其他信息,例如它属于FileSystem(并且将从FileSystem转换为String时将采用默认的Path)。

import java.nio.file.Path;
import javax.persistence.Convert;
import javax.persistence.Entity;

@Entity
public class Photo {

    @Convert(converter = PathConverter.class) // needed if autoApply isn't true
    private Path imagePath;

}

有关更多信息,请参见以下文档:

答案 1 :(得分:1)

路径不是实体,因此,如果您希望数据库将其存储为字符串,则必须将类型更改为字符串,并使用以下Paths.get(String path)返回路径

@Entity
class Photo {

     String imagePathStr;

public String getImagePathStr(){
     return imagePath;
// setter
}

@Transient
public Path getImagePath(){
     return Paths.get(imagePathStr);
}