我不想将图像文件保存到数据库中,但是文件会自动保存到数据库中。
正在保存的模型类代码-
@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。 实际结果-这些将自动保存到数据库中。
答案 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