Частичное обновление Hibernate (как?) - PullRequest
0 голосов
/ 17 августа 2011

У меня проблема с производительностью в режиме гибернации, которая слишком дорога для производительности. Я попытаюсь объяснить мою текущую реализацию, которая должна быть улучшена с помощью псевдо-классов. Допустим, у меня есть следующие классы POJO (классы Entity представляют собой аннотированные «копии» в спящем режиме).

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 местный житель -> местный житель -> местный житель Это создает огромную нагрузку на сервер, так как новые города добавляются часто. Также не нужно преобразовывать все города страны, чтобы просто сохранить и подключить еще один.

Я думаю о создании преобразователя света, который не преобразует все поля, а только те, которые мне нужны для некоторой бизнес-логики при добавлении города, но они останутся неизменными, я не знаю, будет ли Hibernate достаточно хорош, чтобы справиться с этим сценарием. Например, если я сохраню сущность с множеством пустых полей и список городов только с одним городом, могу ли я сказать hibernate объединить это вместе с базой данных. Или есть другой подход, который я могу использовать, чтобы решить проблему с производительностью, но не разделяя 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

В настоящее время я получаю CountryEnity через Java-класс Dao. Тогда у меня есть конвертер классов (Entities -> POJO), который устанавливает все поля и инициирует все списки. У меня также есть похожие конвертеры классов конвертации (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

Заранее спасибо / Фермер

1 Ответ

0 голосов
/ 17 августа 2011

Я подозреваю, что может случиться, что у вас нет индексного столбца в ассоциации, поэтому Hibernate удаляет, а затем вставляет дочернюю коллекцию, а не просто добавляет или удаляет отдельные объекты в и из дочерней ассоциации .

Если именно так и происходит, вы можете попробовать добавить аннотацию @IndexColumn в метод get для дочерней ассоциации. Это позволит Hibernate выполнять дискретные вставки, обновления и удаления в записях ассоциации, в отличие от необходимости удалять, а затем повторно вставлять. После этого вы сможете вставить новый город и его новых жителей без необходимости перестраивать все.

...