不保存图像到数据库中,只想保存URL

时间:2019-07-17 05:05:55

标签: hibernate spring-mvc

我不想将图像文件保存到数据库中,但是文件会自动保存到数据库中。

正在保存的模型类代码-

    @Entity
    @Table(name="product")
    public class AddProduct {
    @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ProductID")
    private int productId;

    @Column(name="productCategoryID")
    private int productCatId;

    @Column(name="ProductName")
    private String productName;

    @Column(name="ProductStock")
    private int productStock;

    @Column(name="ProductSKU")
    private String productsku;

    @Column(name="ProductMrp")
    private long productMrp;

    @Column(name="ProductPrice")
    private long productprize;

    @Column(name="ProductMainImage")
    private String productMainImage;

    @Column(name="ProductSubImage1")
    private String productSubImage1;

    @Column(name="ProductSubImage2")
    private String productSubImage2;

    @Column(name="ProductSubImage3")
    private String productSubImage3;


    private CommonsMultipartFile file1;
    private CommonsMultipartFile file2;
    private CommonsMultipartFile file3;
    private CommonsMultipartFile file4;
    .......................setters and getters

预期结果-不想保存file1,file2,file3,file4。 实际结果-这些将自动保存到数据库中。

3 个答案:

答案 0 :(得分:0)

您可以在@Transient字段上使用CommonsMultipartFile批注。

The @Transient annotation is used to specify that a given entity attribute should not be persisted.

答案 1 :(得分:0)

请确保必须使用transient,因为这是一个Java关键字,它指示将成员变量持久化到字节流时不要序列化。

这些参考变量

private CommonsMultipartFile file1;
private CommonsMultipartFile file2;
private CommonsMultipartFile file3;
private CommonsMultipartFile file4;

应更改。像这样

transient private CommonsMultipartFile file1;
transient private CommonsMultipartFile file2;
transient private CommonsMultipartFile file3;
transient private CommonsMultipartFile file4;

之后,这些将不会保存在数据库中。

答案 2 :(得分:0)

如果我理解它,则希望将内容存储在数据库以外的其他位置,并使其成为可寻址的URL。因此,我不确定接受的答案是否会真正回答问题。 将属性设为瞬态并不会让您拥有URL可寻址的内容。

我会尝试Spring Content社区项目。该项目旨在完全按照您的意图进行操作,与Spring Data很好地集成,并且具有相同的自以为是的编程模型。

如果您对这里感兴趣的话,我想您可以这样做(假设使用Spring Boot)。

将依赖项添加到您的项目中:-

  

pom.xml

    <!-- Java API --> 
    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-fs-boot-starter</artifactId>
        <version>0.9.0</version>
    </dependency>
    <!-- REST API --> 
    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-rest-boot-starter</artifactId>
        <version>0.9.0</version>
    </dependency>

配置文件存储(Spring Content也支持S3):

  

StoreConfig.java

@Configuration
@EnableFilesystemStores
public class EnableFilesystemStoresConfig {

    @Bean
    File filesystemRoot() {
        try {
            return new File("/path/to/your/filestore");
        } catch (IOException ioe) {}
        return null;
    }

    @Bean
    FileSystemResourceLoader fileSystemResourceLoader() {
        return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
    }

}

将内容与您的实体相关联:

    @Entity
    @Table(name="product")
    public class AddProduct {

      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      @Column(name="ProductID")
      private int productId;

      ... other Spring Data fields ...

      private List<Content> contents;
   }

   @Entity
   public class Content {

      ... other required Spring Data fields ...

      @ContentId 
      private UUID contentId;

      @ContentLength 
      private Long contentLength;

      @MimeType 
      private String mimeType;
   }

创建内容存储库:

  

ProductContentStore.java

  public interface ProductContentStore extends ContentStore<Content,UUID> {
  }

spring-content-fs依赖性将导致Spring Content注入ProductContentStore的基于文件系统的实现,因此您不必担心自己实现此问题。此外,spring-content-rest依赖关系还将导致Spring Content也注入@Controller实现,该实现会将HTTP请求转发到ProductContentStore的方法上,从而使内容URL可寻址。

因此,您现在将获得基于REST的功能齐全(POST,PUT,GET,DELETE)的服务,该服务将使用您的ProductContentStore来检索(和存储)服务器上/path/to/your/filestore中的内容,并将该内容与相关的AddProduct实体相关联。

所以:

POST /products/12345/contents -F "image=@/some/path/some/content.pdf"

将上传content.pdf并将其与AddProduct 12345关联。

GET /products/12345/contents/{contentId}

将再次得到它。 REST API支持范围请求,因此HTML5视频控件也将正常工作。

HTH

相关问题