我正在尝试将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链接到二进制字节[]的好方法。
答案 0 :(得分:0)
您的问题是您希望该字段在同一时间转换和包含(序列化)。有些人建议使用@JsonInclude注释,就像提到的here一样。
然而,从我的观点来看,这个想法是在你的应用程序的逻辑中,它与JPA 无关。因此,我会在预先设置之前复制对象,或至少单独复制图像字段。在抵制之后,将预先确定的对象的ID分配给复制的对象的ID。
或者,另一种解决方案是,您可以向数据库中添加一个字符串字段,该字段将保存图像的路径;您首先将图像写入“心脏内容”中。或者在哪里,然后将图像的路径分配给实体并在数据库中保留该路径。
或者,另一种解决方案是,您可以在实体层上方的系统中添加另一个数据模型层,其中包含JSON类,因此您不需要在实体中使用瞬态字段,也不需要JSON注释。