Лучшие практики с сервисом, использующим спящий режим - PullRequest
2 голосов
/ 04 февраля 2011

Я использую Hibernate, и у меня есть проблема с процессом / рекомендациями. Для примера, давайте предположим, что у нас есть 2 объекта Truck и Wheel. Колесо имеет 2 свойства wheelid и wheelmanufacturer. Поэтому в моем приложении пользователь может создать грузовик, выбрать различные колеса, которые существуют в базе данных, или создать собственное колесо.

Мой вопрос: когда я получаю объект грузовика из внешнего интерфейса, как мне убедиться, что если колесо существует в базе данных, используется копия базы данных, а если ее нет в базе данных, добавлен. Вот простой пример того, как мои службы работают сейчас

public Truck saveTruck( Truck truck )
{
     //Yes, this is a two-wheel truck =)
     Wheel frontWheel = truck.getFrontWheel();
     if( frontWheel != null && frontWheel.getWheelId() != null )
     {
         Wheel dbWheel = wheelDao.getWheelById( frontWheel.getWheelId() );
         if( dbWheel != null )
         {
              truck.setFrontWheel(dbWheel );
         }
     }
}

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

Спасибо

Ответы [ 3 ]

1 голос
/ 04 февраля 2011

Это именно то, что делает операция merge().

То есть ваш код можно заменить следующим:

public Truck saveTruck( Truck truck ) {
    //Yes, this is a two-wheel truck =)
    Wheel frontWheel = truck.getFrontWheel();
    if( frontWheel != null) {
         truck.setFrontWheel(wheelDao.merge(dbWheel));         
    }
}

, где wheelDao.merge() обеспечивает доступ к Session.merge().

Если ваш Truck имеет много свойств, которые нужно объединить, вы можете настроить их для каскадной операции merge() и объединения Truck в целом:

public Truck saveTruck( Truck truck ) {
    return session.merge(truck);
}

Смотри также:

1 голос
/ 04 февраля 2011

Я решаю подобные проблемы в пользовательском интерфейсе приложения. У меня есть компонент для отображения объектов-значений, таких как колесо, если пользователь не может найти запрошенное колесо из существующих колес, пользователь может создать новое колесо с помощью компонента.

0 голосов
/ 04 февраля 2011

Я бы реализовал это, отделив GUI от Backend.

GUI будет использовать TruckDTO, который является почти объектом Truck, но вместо Weel содержит строку WeelManufactuer.

Контроллер графического интерфейса получает TruckDTO и передает его какой-либо службе. Сервис, поиск для Weel с изготовителем в БД. Если такой пятки нет, она ее создает. Затем он использует weel (новый или существующий) и TruckDTO для создания объекта Truck.

То же самое для обновления Грузовика. (Конечно, вместо того, чтобы создавать новый Грузовик, вы должны изменить его).

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

...