JPA不会持久保存到数据库而是文件系统

时间:2017-07-11 13:55:29

标签: java jpa

我正在尝试将byte[]字段保存到本地文件系统而不是数据库。

我尝试过JPA注释@Transient

@Entity
@Table(name = "screenshot")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Screenshot implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Lob
    @Transient
    @Column(name = "image", nullable = false)
    private byte[] image;

    @Column(name = "otherField", nullable = false)
    private String otherField;

    @Column(name = "otherField2", nullable = false)
    private String otherField2;
}

但是在我坚持实体之后,例如由于returnedEntity注释,系统不会返回image @Transient属性。

Screenshot returnedEntity = screenshotRepository.save(entity);

但是我需要先将它保存在数据库中才能获得唯一的ID,并将此ID作为文件路径的一部分,仅保留本地文件系统中的图像(二进制)字段。

我遇到的情况是,在将实体保存到数据库之前,我没有唯一的ID。但是在保存实体之后,我丢失了二进制byte []数据以将文件保存在本地文件系统中。

似乎无法找到将保存的ID链接到二进制字节[]的好方法。

1 个答案:

答案 0 :(得分:0)

您的问题是您希望该字段在同一时间转换和包含(序列化)。有些人建议使用@JsonInclude注释,就像提到的here一样。

然而,从我的观点来看,这个想法是在你的应用程序的逻辑中,它与JPA 无关。因此,我会在预先设置之前复制对象,或至少单独复制图像字段。在抵制之后,将预先确定的对象的ID分配给复制的对象的ID。

或者,另一种解决方案是,您可以向数据库中添加一个字符串字段,该字段将保存图像的路径;您首先将图像写入“心脏内容”中。或者在哪里,然后将图像的路径分配给实体并在数据库中保留该路径。

或者,另一种解决方案是,您可以在实体层上方的系统中添加另一个数据模型层,其中包含JSON类,因此您不需要在实体中使用瞬态字段,也不需要JSON注释。