Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как лучше реализовать / 25 сообщений из 38, страница 1 из 2
09.09.2014, 07:57
    #38741267
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
Есть модель водителя:
Код: java
1.
2.
3.
4.
5.
6.
7.
Driver {
    private long id;
    private String firstName;
    private String lastName;
    private String phone;
    И ЕЩЕ + 7 РАЗЛИЧНЫХ ПОЛЕЙ
}


При обновлении информации о водителе, присылается полностью вся модель с заполненными данными. Далее происходит обновление:
Код: java
1.
driverRepository.save(driver);


Мне не нравится, что при обновлении, например, просто имени, приходится таскать всю эту длинную модель с заполненными данными. Если, например, номер телефона не меняется, в private String phone; приходит нулл, но при save(driver) в базе обнуляется старый телефон, а этого быть не должно. Как бы это красиво разрулить? Спасибо.
...
Рейтинг: 0 / 0
09.09.2014, 09:07
    #38741303
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
JulTМне не нравится
Интнересный критерий. А заказчик знает?
Откуда приходят данные, что вас напрягает их количество?
Почемы данные не находятся в кэше?
Что именно даст такая оптимизация помимо вашего морального удовлетворения?

Код: java
1.
driverRepository.updateField("firstName", driver.getId());
...
Рейтинг: 0 / 0
09.09.2014, 10:19
    #38741362
smackmychi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
JulT,

А driverRepository - это экземпляр какого класса?
...
Рейтинг: 0 / 0
09.09.2014, 10:22
    #38741371
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
smackmychiJulT,

А driverRepository - это экземпляр какого класса?
очевидно, что класса DriverRepository)))
...
Рейтинг: 0 / 0
09.09.2014, 10:26
    #38741376
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
BlazkowiczJulTМне не нравится
Интнересный критерий. А заказчик знает?
Откуда приходят данные, что вас напрягает их количество?
Почемы данные не находятся в кэше?
Что именно даст такая оптимизация помимо вашего морального удовлетворения?

Код: java
1.
driverRepository.updateField("firstName", driver.getId());


Данные приходят с ios-клиента. Если какие-то поля в моделе не заполнены, при сохранении они обнуляются, а мне их (поля) не шлют не потому что их нужно обнулить, а чтобы не гнать с клиента длинную простыню с данными
...
Рейтинг: 0 / 0
09.09.2014, 10:27
    #38741378
smackmychi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
Nixic,

Увы, я не гадалка и оснований для очевидности кроме фактов из уст автора взять не могу.
...
Рейтинг: 0 / 0
09.09.2014, 10:30
    #38741383
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
JulTДанные приходят с ios-клиента. Если какие-то поля в моделе не заполнены, при сохранении они обнуляются, а мне их (поля) не шлют не потому что их нужно обнулить, а чтобы не гнать с клиента длинную простыню с данными
Как делается в нормальных ORM. Читам драйвера по id из репозитория. Так как iOS клиент недавно загружал этого драйвера, то запись должна быть в кэшах и чтение стоит минимум. Записываем в объект свойства, которые приехали из клиента.
В Hibernate остаётся только закомитить транзакцию, чтобы он обнаружил обновленные свойства и проапдейтил запись в базе.
Что конкретно смущает? Наличие кэша?
...
Рейтинг: 0 / 0
09.09.2014, 10:33
    #38741386
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
BlazkowiczJulTДанные приходят с ios-клиента. Если какие-то поля в моделе не заполнены, при сохранении они обнуляются, а мне их (поля) не шлют не потому что их нужно обнулить, а чтобы не гнать с клиента длинную простыню с данными
Как делается в нормальных ORM. Читам драйвера по id из репозитория. Так как iOS клиент недавно загружал этого драйвера, то запись должна быть в кэшах и чтение стоит минимум. Записываем в объект свойства, которые приехали из клиента.
В Hibernate остаётся только закомитить транзакцию, чтобы он обнаружил обновленные свойства и проапдейтил запись в базе.
Что конкретно смущает? Наличие кэша?
наличие кеша
...
Рейтинг: 0 / 0
09.09.2014, 10:35
    #38741387
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
smackmychiNixic,

Увы, я не гадалка и оснований для очевидности кроме фактов из уст автора взять не могу.
DriverRepository driverRepository
...
Рейтинг: 0 / 0
09.09.2014, 10:35
    #38741388
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
а чего вас смущает не пойму, написали один раз метод апдейта, типа:

Приведу пример из моего проекта, где апдейтится все через персистенс EntityManager и т.д.

Генерируем геттеры и сеттеры для нашего класса Driver, потом используем их

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public void updateDriver(Driver dr) {

//находим изменяемый экземпляр Driver dx

em.getTransaction().begin();
 Driver dx = em.find(Driver.class, dr.getId());
  dx.setFirstName(dr.getFirstName());
  dx.setLastName(dr.getLastName());
  dx.setPhone(dr.getPhone());
em.getTransaction().commit();
}



Все это конечно через трай и т.д.

В итоге берем нашего шофера
меняем ему имя:

Код: java
1.
2.
3.
Driver someDriver = ....
someDriver.setFirstName("Вася");
driverRepository.updateDriver(someDriver);




Точно так же можно написать методы и для JDBC или другого.
...
Рейтинг: 0 / 0
09.09.2014, 10:36
    #38741392
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
Nixicа чего вас смущает не пойму, написали один раз метод апдейта, типа:

Приведу пример из моего проекта, где апдейтится все через персистенс EntityManager и т.д.

Генерируем геттеры и сеттеры для нашего класса Driver, потом используем их

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public void updateDriver(Driver dr) {

//находим изменяемый экземпляр Driver dx

em.getTransaction().begin();
 Driver dx = em.find(Driver.class, dr.getId());
  dx.setFirstName(dr.getFirstName());
  dx.setLastName(dr.getLastName());
  dx.setPhone(dr.getPhone());
em.getTransaction().commit();
}



Все это конечно через трай и т.д.

В итоге берем нашего шофера
меняем ему имя:

Код: java
1.
2.
3.
Driver someDriver = ....
someDriver.setFirstName("Вася");
driverRepository.updateDriver(someDriver);




Точно так же можно написать методы и для JDBC или другого.
у меня Spring Data
...
Рейтинг: 0 / 0
09.09.2014, 10:36
    #38741394
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
JulTналичие кеша
ORM без кэша это кайф.
...
Рейтинг: 0 / 0
09.09.2014, 10:48
    #38741409
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
BlazkowiczJulTналичие кеша
ORM без кэша это кайф.
Ок, прописать в конфигах для хибера пару строчек для использования кеша - это не проблема. А как мне вытащить объект из кеша, учитывая то, что я использую спринг дата. Обычно я делаю так: driverRepository.findOne(driverId) - если в конфигурации прописано использование кеша второго уровня, гарантирует ли это, что при вызове findOne объект будет подтянут именно из кеша? Простите если задаю глупые вопросы, просто не совсем могу уловить смысл. Спасибо
...
Рейтинг: 0 / 0
09.09.2014, 10:51
    #38741414
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
JulTОк, прописать в конфигах для хибера пару строчек для использования кеша - это не проблема. А как мне вытащить объект из кеша, учитывая то, что я использую спринг дата. Обычно я делаю так: driverRepository.findOne(driverId) - если в конфигурации прописано использование кеша второго уровня, гарантирует ли это, что при вызове findOne объект будет подтянут именно из кеша? Простите если задаю глупые вопросы, просто не совсем могу уловить смысл. Спасибо
Чтобы изменить поля у сущности, пользователь эту сущность должен сначала увидеть.
Чтобы показать пользователю сущность, её состояние надо вычитать из БД.
При чтении сущность попадает в кэш.
Поэтому с вероятностью 99%, при вызове операции изменения свойств, сущность будет жить в кэше. Поэтому чтение её по id стоит ничтожно мало.
...
Рейтинг: 0 / 0
09.09.2014, 11:01
    #38741418
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
Blazkowicz,
А с первым кешем это не работает?
...
Рейтинг: 0 / 0
09.09.2014, 11:04
    #38741421
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
Petro123Blazkowicz,
А с первым кешем это не работает?
Если под "первым кешем" имеется ввиду кеш первого уровня, то, обычно - нет.
Кеш первого уровня aka session, живет в течении бизнес транзакции. Либо сеанса запрос-ответ.
Описаный же сценарий включает в себя две транзакции
- Чтение сущности и показ клиенту
- Обновление свойств сущности
...
Рейтинг: 0 / 0
09.09.2014, 11:08
    #38741426
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
Blazkowicz,
Напр. я в сервлете получил телефон с клиента.
Достал сущность...записа нов телефон. ..
Он остальные поля обнулит?
...
Рейтинг: 0 / 0
09.09.2014, 11:08
    #38741427
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
BlazkowiczJulTОк, прописать в конфигах для хибера пару строчек для использования кеша - это не проблема. А как мне вытащить объект из кеша, учитывая то, что я использую спринг дата. Обычно я делаю так: driverRepository.findOne(driverId) - если в конфигурации прописано использование кеша второго уровня, гарантирует ли это, что при вызове findOne объект будет подтянут именно из кеша? Простите если задаю глупые вопросы, просто не совсем могу уловить смысл. Спасибо
Чтобы изменить поля у сущности, пользователь эту сущность должен сначала увидеть.
Чтобы показать пользователю сущность, её состояние надо вычитать из БД.
При чтении сущность попадает в кэш.
Поэтому с вероятностью 99%, при вызове операции изменения свойств, сущность будет жить в кэше. Поэтому чтение её по id стоит ничтожно мало.
в таком случае мне достаточно прописать в конфигурации:
Код: java
1.
<prop key="hibernate.cache.use_second_level_cache">true</prop>
...
Рейтинг: 0 / 0
09.09.2014, 11:14
    #38741431
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
JulTв таком случае мне достаточно прописать в конфигурации:
Код: java
1.
<prop key="hibernate.cache.use_second_level_cache">true</prop>


http://javabrowsers.blogspot.com/2012/07/dirty-checking-in-hibernate.html
...
Рейтинг: 0 / 0
09.09.2014, 11:15
    #38741433
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
Petro123Blazkowicz,
Напр. я в сервлете получил телефон с клиента.
Достал сущность...записа нов телефон. ..
Он остальные поля обнулит?
Нет. Они же заполнены на шаге "Достал сущность".
Ещё есть полезная фича dynamic-update в маппинге сущностей
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html
...
Рейтинг: 0 / 0
09.09.2014, 11:19
    #38741441
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
а зачем использовать прослойку hobermate?
без неё не прще?
...
Рейтинг: 0 / 0
09.09.2014, 11:25
    #38741451
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
вадяа зачем использовать прослойку hobermate?
без неё не прще?
Когда как.
...
Рейтинг: 0 / 0
09.09.2014, 11:42
    #38741480
smackmychi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
Blazkowicz,

А в каких случаях он(или эквивалент) точно может быть необходим?
...
Рейтинг: 0 / 0
09.09.2014, 11:53
    #38741495
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
smackmychiА в каких случаях он(или эквивалент) точно может быть необходим?
Типичный ERP - сущности, размазанные по десяткам нормализованых таблиц. Писать 100500 джоинов одних и тех же таблиц для разных сценариев штука геморная. Помимо этого - готовое адекватное кеширование. Релизовать самому такое же, при толстых кустарных запросах будет сложно. Query Builder в виде Criteria API. Написать аналог на SQL для различных Inquiry - тоже веселье не мало.
...
Рейтинг: 0 / 0
09.09.2014, 11:57
    #38741501
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше реализовать
Если я включаю кеш второго уровня, нужно ли при этом добавлять для сущности следующее:
@Entity
@Table(name = "driver")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как лучше реализовать / 25 сообщений из 38, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]