Hibernate部分更新(如何?)

时间:2011-08-17 12:50:01

标签: java database hibernate java-ee persistence

我的hibernate实现存在性能问题,但性能成本太高。 我将尝试解释我当前的实现,必须使用伪类进行改进。 假设我有以下POJO类(实体类是hibernate注释的“副本”)。

Country.java and CountryEntity.java 
City.javaand CityEntity.java 
Inhabitant.javaand InhabitantEntity.java 

我想将一个城市添加到一个国家并将其保存/保存在数据库中,新城市将完全填充为POJO。 当前代码

CountryEntity countryEntity = CountryDao.fetch(someId);
Country country = CountryConverter(countryEnity);
country.getCities.add(newCity);
countryEnity = CountryEntityConverter(country);
CountryDao.save(countryEnity);

这会导致严重的性能问题。假设我有200个拥有10,000名居民的城市。 对于我添加一个新的城市,转换器将转换200 x 10,000 = 2,000,000居民实体 - >居民 - > inhabitantEntity 这会给服务器带来巨大负担,因为经常会添加新城市。 转换该国所有城市只是为了坚持并连接另一个城市也是不必要的。

我正在考虑创建一个光转换器,它不会转换所有字段,只有在添加城市时我需要的一些业务逻辑,但那些将保持不变,我不知道是否Hibernate足以处理这种情况。 例如,如果我保存一个具有大量空字段的实体和只有一个城市的列表城市,我可以告诉hibernate将它与db一起合并。 或者我可以采取不同的方法来解决性能问题,但保持POJO和实体分开?

下面的一些代码显示了我当前的“慢”实现代码。

Country.Java (pseudo code)
 private fields
 private List<City> cities;

City.Java (pseudo code)
 private fields
 private List<Inhabitant> inhabitants;

Inhabitant.Java (pseudo code)
 private fields

目前我通过Dao java类获取CountryEnity。 然后我有转换器类(实体 - &gt; POJO),它设置所有字段并启动所有列表。 我也有类似的转换器类转换(POJO - &gt;实体)。

CountryConverter(countryEntity)
 Country country = new Country();
 Country.setField(countryEntity.getField())
 Loop thru cityEnitites
  Country.getCities.add(CityConverter(cityEntity))
 return country

CityConverter(cityEntity)
 City city = new City()
 city.setField(cityEntity.getField())
 Loop thru inhabitantEnitites
  city.getInhabitants.add(InhabitantConverter(inhabitantEntity))
 return country

InhabitantConverter(inhabitantEntity)
 Inhabitant inhabitant = new Inhabitant()
 inhabitant.setField(inhabitantEntity.getField())
 return inhabitant

提前致谢/ Farmor

1 个答案:

答案 0 :(得分:0)

我怀疑可能发生的事情是你没有关联的索引列,因此Hibernate正在删除然后插入子集合,而不是仅仅向子协会添加或删除离散对象

如果正在进行,您可以尝试在子关联的get方法中添加@IndexColumn注释。然后,这将允许Hibernate在关联记录上执行离散插入,更新和删除,而不是必须删除然后重新插入。然后,您就可以插入新城市及其新居民而无需重建所有内容。