Hibernate调用错误的setter

时间:2015-06-17 07:22:51

标签: java hibernate

我对hibernate从数据库加载一些bean的方式有一些问题。

我们使用bean / beanHistoric结构来持久保存对该bean所做的所有更改。当我们在bean实例中持续一些更改时,我们创建一个具有相同数据的beanHistoric并保存它,以便这样做,一些setter不是完全setter。 例如:

@Entity
public class beanHistoric {
    List<AnotherBeanHistoric> anotherBeanListH;

    @OneToMany(mappedBy="beanHistoric", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    public List<AnotherBeanHistoic> getAnotherBeanList(){
        return this.anotherBeanListH;
    }
    public void setAnotherBeanList(List<AnotherBean> anotherBeanList){
        for (AnotherBean anotherBean : anotherBeanList){
            anotherBeanListH.add(new AnotherBeanHistoric(anotherBean))
        }
    }

    private void setAnotherBeanListH(List<AnotherBeanHistoric> anotherBeanList){
        this.anotherBeanListH = anotherBeanList;
    }
}

正如您所看到的,该属性被写为anotherBeanListH,但是hibernate在调用setAnotherBeanList时,一旦从数据库而不是setAnotherBeanListH加载该对象,就会填充该对象。

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

你告诉Hibernate,名为anotherBeanList的属性通过注释getter getAnotherBeanList()被映射为OneToMany。因此,当从数据库中读取实体时,它会通过调用关联的setter来填充关联:setAnotherBeanList()。相反的是相当令人惊讶的。如果属性名为setBar()

,为什么Hibernate会调用foo

答案 1 :(得分:1)

好的,当我编辑添加bean中使用的anotations的问题时,我意识到我的getter名称为getAnotherBeanList而不是getAnotherBeanListH

当我在getter中使用我的anotations(我必须遵循的一些遗留样式)而不是属性本身时,似乎hibernate理解getter的名称是属性的名称,因此要调用的setter是{ {1}}。

在提出这个问题之前应该看起来有点难,但我认为值得知道这可能会发生。