文件
对于大型二进制或文本内容(数据库 LOB),我们可以在实体 Bean 中将其建模为 java.io.File
类型的属性,并使用 @Lob
。
@Entity
public class SomeFileBean {
...
@Lob
File content;
默认情况下延迟获取
默认情况下,所有 @Lob
属性都是延迟获取的,这意味着默认情况下它们不会被获取,除非显式包含在 select 子句中。
请注意,文件属性(和其他 Lob 属性)将根据需要延迟加载。
QSomeFileBean b = QSomeFileBean.alias()
SomeFileBean bean =
new QSomeFileBean()
.select(b.name, b.content)
.id.eq(42)
.findOne();
File content = bean.getContent();
内容流式传输到文件
对于返回的每个文件,Ebean 都会创建一个临时文件,并将内容从数据库 Lob 结果流式传输到该文件中。因此,当我们使用文件获取 Bean 时,我们希望以某种方式处理该文件,然后可能丢弃、删除或移动临时文件。如果我们不这样做,则会导致临时目录中临时文件堆积。
插入
// have the content as a File
File tempFile = ...;
UserProfile profile = new UserProfile();
profile.setName("Rob");
profile.setProfileImage(tempFile);
database.save(profile);
// typically tidy up file
tempFile.delete();
获取
QUserProfile u = QUserProfile.alias()
UserProfile profile =
new QUserProfile()
.select(u.name, u.profileImage)
.id.eq(42)
.findOne();
File image = profile.getProfileImage();
// do something with the image file
// maybe move it to a cache directory
// or tidy up by deleting the temporary file
image.delete();
无状态更新
执行无状态更新通常很有用,我们可以在不获取文件内容的情况下更新文件内容。
// have the content as a File
File updatedProfileImage = ...;
UserProfile profile = new UserProfile();
profile.setId(42);
profile.setProfileImage(updatedProfileImage);
// perform update without fetching
database.update(profile);
// typically tidy up file
updatedProfileImage.delete();