在我们的Spring MVC - Hibernate项目中,我们通过Web服务存储上传的文件。但是,我们还将与文件相关的信息保存在数据库的表中。 File类的简化版如下:
@Entity
@Table(name="FILE")
public class File {
@Id
@Column(name="ID")
public int id;
@Column(name="NAME")
public String name;
@Transient
public byte[] data;
public int getId() {
}
public void setId(int id) {
}
public String getName() {
}
public void setName(String name) {
}
public byte[] getData() {
}
public void setData(byte[] data) {
}
}
我们从数据库加载File实体并从Web服务获取其数据,如下所示:
File file = dao.getFileById({file_id});
byte[] data = webService.getFileData({file_id});
file.setData(data);
我们在代码中的很多地方使用File实体,每次我们编写查询来获取文件时,我们都必须调用Web服务方法来加载其数据。此外,我们必须为其他具有映射到File类的实体执行此操作,如下所示:
@Entity
@Table(name="PATIENT_FILE")
PatientFile {
...
@ManyToOne
@JoinColumn(name="FILE_ID")
File file;
...
}
现在,每当我们从数据库加载PatientFile时,我们都必须从Web服务手动获取文件的二进制数据。
有没有办法让Hibernate自动执行此操作,以便每当加载文件实体时,Hibernate从Web服务获取其数据以填充File对象的数据字段?
注意:我知道我可以在File类中实现Lifecycle接口并覆盖onLoad方法来执行此操作,但我需要一个更集中的解决方案。另外,从模型中调用数据层方法并不好。
答案 0 :(得分:1)
是的,您可以实施Hibernate Interceptor。通过实现在对象初始化之前调用的onLoad
方法,您可以调用Web服务并填充数据。该方法必须检查它是否是您正在加载的File对象。