开发者

Hibernate partial update (How to?)

I have a performance problem with a hibernate implementation that is far to performance costly. I will try to explain my current implementation which must be improved upon with pseudo classes. Let’s say I have the following POJO classes (the Entity classes are hibernate annotated "copies").

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

And I want to add a city to a country and save/persist it in the database, the new city arrives fully populated as a POJO. Current code

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

This results in a major performance problem. Let's say I have 200 cities with 10,000 inhabitants. For me to add a new city the converter will convert 200 x 10,000 = 2,000,000 inhabitantEntity --> inhabitant --> inhabitantEntity This puts a tremendous load on the server, as new cities are added often. It also feels unnecessary to convert all cities in the country just to persist and connect another one.

I am thinking of creating a li开发者_如何转开发ght converter which doesn't convert all the fields and only the ones I need for some business logic during the addition of the city, but those will be kept unchanged, I don't know if Hibernate is good enough to handle this scenario. For example if I save an entity with alot of null fields and the list cities with only one city, can I tell hibernate to merge this together with the db. Or is there a different approace I can take to solve the performance problem but keeping the POJO and Entitys separate?

Some code below showing my current "slow" implementation code.

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

Currently I fetch a CountryEnity thru a Dao java class. Then I have converter classes (Entities --> POJO) that sets all fields and initiate all lists. I also have similar converter classes converting (POJO --> Entities).

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

Thanks in advance /Farmor


I suspect what might be happening is that you don't have an index column on the association, so Hibernate is deleting and then inserting the child collection, as opposed to just adding to or deleting discrete objects to and from the child association.

If that is what's going on, you could try adding an @IndexColumn annotation to the get method for the child association. That will then allow Hibernate to perform discrete inserts, updates, and deletes on association records, as opposed to having to delete and then re-insert. You would then be able to insert the new city and its new inhabitants without having to rebuild everything.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜