【问题标题】:Hibernate: Populate Some Fields From Web ServiceHibernate:从 Web 服务填充一些字段
【发布时间】:2015-11-24 13:16:06
【问题描述】:

在我们的 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 实体,每次我们编写查询来获取 File 时,我们都必须调用 Web 服务方法来加载其数据。我们还必须为其他具有到 File 类的映射的实体执行此操作,如下所示:

@Entity
@Table(name="PATIENT_FILE")
PatientFile {
    ...

    @ManyToOne
    @JoinColumn(name="FILE_ID")
    File file;

    ...
}

现在,每当我们从数据库加载 PatientFile 时,我们都必须手动从 Web 服务获取文件的二进制数据。

有没有办法让 Hibernate 自动执行此操作,以便每当加载 File 实体时,Hibernate 从 Web 服务获取其数据以填充 File 对象的数据字段?

注意:我知道我可以在 File 类中实现 Lifecycle 接口并重写 onLoad 方法来执行此操作,但我需要一个更集中的解决方案。另外,从模型中调用数据层方法也不是很好。

【问题讨论】:

    标签: spring hibernate web-services spring-mvc


    【解决方案1】:

    是的,您可以实现Hibernate Interceptor。通过实现在对象初始化之前调用的onLoad 方法,您可以进行Web 服务调用并填充数据。该方法必须检查它是否是您正在加载的 File 对象。

    【讨论】:

    • 是仅对根实体调用 onLoad 方法,还是对所有实体调用,无论它们是通过关系映射还是 hql 查询加载?
    • 应该在每个初始化为 Java 的对象上调用它,无论它是通过关系映射还是 HQL 等加载...
    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2011-07-16
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多