Java + Hibernate:从数据库中检索对象时,Fire属性更改事件

时间:2015-09-30 21:56:14

标签: java hibernate

所以,我想在这里解决这个问题,我想知道它是否甚至不能在第一时间完成。

无论如何,我正在使用Hibernate进行ORM映射。所有这一切都很完美,它可以完美地构建我的持久性bean等等。困扰我的一个方面是:我有一个模型,当它被创建时,需要将其值传递给UI。我已经使用PropertyChangeEvents设置了一个很棒的系统来完成这个任务。所有这个模型的字段都是绑定属性,只要它们的值发生更改,就会触发事件并更新UI。不错,简单,优雅。

问题在于,当我从数据库中获取此模型时,使用Hibernate,在Hibernate加载模型之前,我无法向其添加PropertyChangeListener。这意味着当Hibernate设置所有字段时,事件不会被触发。不能使用这些PropertyChangeEvents将是一个真正的痛苦,我将不得不编写一堆其他代码专门绕过我为整个应用程序为这一特定上下文设置的系统。

我希望有一种方法可以在Hibernate创建模型时听取设置的字段,以便PropertyChangeEvents可以进入我的UI。如果没有,我能想到的最好的选择是在该特定模型中创建一个公共方法,以允许对各个字段强制输出PropertyChangeEvents,即使没有任何改变。

这是从数据库中检索对象的代码。提前谢谢。

PS。有一个完全无关的错误,Hibernate在VM关闭时仍然在我的数据库上执行更新,即使我没有设置我的程序在关机时进行保存。但是,在我有机会查看Hibernate日志并查看是否可以在那里找到问题后,我会在另一个问题中处理这个问题。

public PortfolioModel getPortfolio(int userid) throws HibernateException{
    SQLPortfolioModel portfolio = null;

    Session session = null;
    try{
        session = factory.openSession();
        session.beginTransaction();
        portfolio = (SQLPortfolioModel) session.createCriteria(SQLPortfolioModel.class)
                        .add(Restrictions.naturalId().set("userID", userid))
                        .setFetchMode("stockList", FetchMode.JOIN)
                        .uniqueResult();

        session.getTransaction().commit();
    }
    finally{
        if(session != null){
            session.close();
        }
    }

    return portfolio;
}

1 个答案:

答案 0 :(得分:1)

您可以使用Entity listeners and Callback methods

对于Entity,您可以像这样定义实体的回调方法

@PostLoad
public void processPOstLoad()