我对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加载该对象,就会填充该对象。
为什么会发生这种情况?
答案 0 :(得分:2)
你告诉Hibernate,名为anotherBeanList
的属性通过注释getter getAnotherBeanList()
被映射为OneToMany。因此,当从数据库中读取实体时,它会通过调用关联的setter来填充关联:setAnotherBeanList()
。相反的是相当令人惊讶的。如果属性名为setBar()
?
foo
答案 1 :(得分:1)
好的,当我编辑添加bean中使用的anotations的问题时,我意识到我的getter名称为getAnotherBeanList
而不是getAnotherBeanListH
。
当我在getter中使用我的anotations(我必须遵循的一些遗留样式)而不是属性本身时,似乎hibernate理解getter的名称是属性的名称,因此要调用的setter是{ {1}}。
在提出这个问题之前应该看起来有点难,但我认为值得知道这可能会发生。