powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как лучше реализовать
38 сообщений из 38, показаны все 2 страниц
Как лучше реализовать
    #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
Как лучше реализовать
    #38741303
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTМне не нравится
Интнересный критерий. А заказчик знает?
Откуда приходят данные, что вас напрягает их количество?
Почемы данные не находятся в кэше?
Что именно даст такая оптимизация помимо вашего морального удовлетворения?

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

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

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

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


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

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

Увы, я не гадалка и оснований для очевидности кроме фактов из уст автора взять не могу.
DriverRepository driverRepository
...
Рейтинг: 0 / 0
Как лучше реализовать
    #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
Как лучше реализовать
    #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
Как лучше реализовать
    #38741394
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTналичие кеша
ORM без кэша это кайф.
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741409
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulTналичие кеша
ORM без кэша это кайф.
Ок, прописать в конфигах для хибера пару строчек для использования кеша - это не проблема. А как мне вытащить объект из кеша, учитывая то, что я использую спринг дата. Обычно я делаю так: driverRepository.findOne(driverId) - если в конфигурации прописано использование кеша второго уровня, гарантирует ли это, что при вызове findOne объект будет подтянут именно из кеша? Простите если задаю глупые вопросы, просто не совсем могу уловить смысл. Спасибо
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741414
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTОк, прописать в конфигах для хибера пару строчек для использования кеша - это не проблема. А как мне вытащить объект из кеша, учитывая то, что я использую спринг дата. Обычно я делаю так: driverRepository.findOne(driverId) - если в конфигурации прописано использование кеша второго уровня, гарантирует ли это, что при вызове findOne объект будет подтянут именно из кеша? Простите если задаю глупые вопросы, просто не совсем могу уловить смысл. Спасибо
Чтобы изменить поля у сущности, пользователь эту сущность должен сначала увидеть.
Чтобы показать пользователю сущность, её состояние надо вычитать из БД.
При чтении сущность попадает в кэш.
Поэтому с вероятностью 99%, при вызове операции изменения свойств, сущность будет жить в кэше. Поэтому чтение её по id стоит ничтожно мало.
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741418
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
А с первым кешем это не работает?
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741421
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Blazkowicz,
А с первым кешем это не работает?
Если под "первым кешем" имеется ввиду кеш первого уровня, то, обычно - нет.
Кеш первого уровня aka session, живет в течении бизнес транзакции. Либо сеанса запрос-ответ.
Описаный же сценарий включает в себя две транзакции
- Чтение сущности и показ клиенту
- Обновление свойств сущности
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741426
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Напр. я в сервлете получил телефон с клиента.
Достал сущность...записа нов телефон. ..
Он остальные поля обнулит?
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741427
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulTОк, прописать в конфигах для хибера пару строчек для использования кеша - это не проблема. А как мне вытащить объект из кеша, учитывая то, что я использую спринг дата. Обычно я делаю так: driverRepository.findOne(driverId) - если в конфигурации прописано использование кеша второго уровня, гарантирует ли это, что при вызове findOne объект будет подтянут именно из кеша? Простите если задаю глупые вопросы, просто не совсем могу уловить смысл. Спасибо
Чтобы изменить поля у сущности, пользователь эту сущность должен сначала увидеть.
Чтобы показать пользователю сущность, её состояние надо вычитать из БД.
При чтении сущность попадает в кэш.
Поэтому с вероятностью 99%, при вызове операции изменения свойств, сущность будет жить в кэше. Поэтому чтение её по id стоит ничтожно мало.
в таком случае мне достаточно прописать в конфигурации:
Код: java
1.
<prop key="hibernate.cache.use_second_level_cache">true</prop>
...
Рейтинг: 0 / 0
Как лучше реализовать
    #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
Как лучше реализовать
    #38741433
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Blazkowicz,
Напр. я в сервлете получил телефон с клиента.
Достал сущность...записа нов телефон. ..
Он остальные поля обнулит?
Нет. Они же заполнены на шаге "Достал сущность".
Ещё есть полезная фича dynamic-update в маппинге сущностей
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741441
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем использовать прослойку hobermate?
без неё не прще?
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741451
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяа зачем использовать прослойку hobermate?
без неё не прще?
Когда как.
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741480
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

А в каких случаях он(или эквивалент) точно может быть необходим?
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741495
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smackmychiА в каких случаях он(или эквивалент) точно может быть необходим?
Типичный ERP - сущности, размазанные по десяткам нормализованых таблиц. Писать 100500 джоинов одних и тех же таблиц для разных сценариев штука геморная. Помимо этого - готовое адекватное кеширование. Релизовать самому такое же, при толстых кустарных запросах будет сложно. Query Builder в виде Criteria API. Написать аналог на SQL для различных Inquiry - тоже веселье не мало.
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741501
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я включаю кеш второго уровня, нужно ли при этом добавлять для сущности следующее:
@Entity
@Table(name = "driver")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
?
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741508
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTЕсли я включаю кеш второго уровня, нужно ли при этом добавлять для сущности следующее:
Нет.
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741578
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulTЕсли я включаю кеш второго уровня, нужно ли при этом добавлять для сущности следующее:
Нет.
странно, а на хабре пишут что:
http://floomby.ru/s2/meYArR/full/
конечно же вам доверяю больше)
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741606
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT http://floomby.ru/s2/meYArR/full/
конечно же вам доверяю больше)


Доверять нужно не мне, а документации. Потому что с одной строны, задаётся глобально.
мануалhibernate.cache.default_cache_concurrency_strategy

Setting used to give the name of the default org.hibernate.annotations.CacheConcurrencyStrategy to use when either @Cacheable @Cache} is used. @Cache(strategy="..") is used to override this default.When possible, define the cache concurrency strategy per entity rather than globally. Use the @org.hibernate.annotations.Cache annotation.

Но, с другой
мануалWhen possible, define the cache concurrency strategy per entity rather than globally. Use the @org.hibernate.annotations.Cache annotation.
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741818
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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) в базе обнуляется старый телефон, а этого быть не должно. Как бы это красиво разрулить? Спасибо.

системная проблема, два варианта:
1. тянуть на iOS клиент все данные и отдавать все данные с изменениями, на сервере пересохранять все
2. тянуть на iOS клиент только необходимые данные, но на сервер передавать признак - очистки того или иного поля, на сервере - если пришло пустое значение (NULL) - не передавать его в базу, а если пришел признак очистки - тогда очистить в базе
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741845
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczКак делается в нормальных ORM
а если там нет ORM?
BlazkowiczЧитам драйвера по id из репозитория. Так как iOS клиент недавно загружал этого драйвера, то запись должна быть в кэшах и чтение стоит минимум
а если отправка данных на сохранение идет на другой сервер, в котором еще никто не читал из базы?
BlazkowiczЗаписываем в объект свойства, которые приехали из клиента
приехало null, записываем null - где решение проблемы?
BlazkowiczВ Hibernate остаётся только закомитить транзакцию, чтобы он обнаружил обновленные свойства и проапдейтил запись в базе
держать транзакцию открытой все это время? вы это серьезно? напишите, пжл, свое ФИО, чтобы я выбрасывал ваше резюме в корзину

Nixicа чего вас смущает не пойму, написали один раз метод апдейта, типа:
Приведу пример из моего проекта, где апдейтится все через персистенс EntityManager и т.д.
Генерируем геттеры и сеттеры для нашего класса Driver, потом используем их
проблемы вашего кода мне очевидны, а вам?

JulTОк, прописать в конфигах для хибера пару строчек для использования кеша - это не проблема....
дальше идет полный треш
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741871
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
17-77,

Я, конечно, извиняюсь, наверное.

Но у вас вообще кроме треша ничего нет.

Соизвольте представить свое решение.
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741872
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77а если там нет ORM?

Мы тут не первый день JulT ассистируем. Уже знаем что там и как.

17-77а если отправка данных на сохранение идет на другой сервер, в котором еще никто не читал из базы?

Это может происходит только если нода отвалилась. А, так, клиентские сессии привязываются к нодам. Это нормальная практика.
В худшем сценарии, придется мимо кэша вычитать из базы. Вот трагедия-то.

17-77приехало null, записываем null - где решение проблемы?

Приехало null, записываем null. Не приехало - не записываем. В чем вопрос?

17-77держать транзакцию открытой все это время? вы это серьезно?
Всё время обработки запроса пользовалетя? Это наверное невероятно долго.

17-77напишите, пжл, свое ФИО, чтобы я выбрасывал ваше резюме в корзину
нах.. пошел.
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741891
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smackmychiСоизвольте представить свое решение.
16554744
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741945
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут больше похоже на экономию на спичках.
JulT хочет так сделать, только потом что не нравиться. Если это не отражается на производительности, то какой смысл извращаться? Если поток данных огромен, тогда это имеет смысл. Но из задачи видно, что этим можно спокойно пренебречь и потратить время на что-то более интересное и полезное.
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741948
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, хорошо когда все апдейты через хибер идут, а когда извне, минуя всякие кеши и прочие стены...?
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741950
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTблин, хорошо когда все апдейты через хибер идут, а когда извне, минуя всякие кеши и прочие стены...?
Либо вешать слушателя и чистить кэши. Либо продумывать архитектуры целиком, а не точечно.
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741986
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
обидели малыша, не плач, я на те <чупа-чупс>

JulTблин, хорошо когда все апдейты через хибер идут, а когда извне, минуя всякие кеши и прочие стены...?
ну вот, другое дело, потихоньку приходит понимание, что кэш не имеет абсолютно никакого отношения к проблеме, как и технология доступа к данным
проблема лежит в трансфере данных от клиента к серверу, и заключается в том, что под NULL понимается два состояния - клиент либо данные почистил, либо даже на запросил с сервера, вот это и надо разрулить
хотя как вариант - если клиент НИКОГДА не очищает данные (поля) - то все проще - добавь в свой метод save - проверку на NULL - если NULL - пропускаешь поле (не добавляешь в update sql)
...
Рейтинг: 0 / 0
Как лучше реализовать
    #38741992
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77обидели малыша, не плач, я на те <чупа-чупс>

По техническим вопросам ламо возражений не имеет. Так и запишем.

17-77ну вот, другое дело, потихоньку приходит понимание, что кэш не имеет абсолютно никакого отношения к проблеме, как и технология доступа к данным
проблема лежит в трансфере данных от клиента к серверу, и заключается в том, что под NULL понимается два состояния - клиент либо данные почистил, либо даже на запросил с сервера, вот это и надо разрулить
хотя как вариант - если клиент НИКОГДА не очищает данные (поля) - то все проще - добавь в свой метод save - проверку на NULL - если NULL - пропускаешь поле (не добавляешь в update sql)
Да-да. Перепиши всё на SQL и не мучайся. Дельный совет.
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как лучше реализовать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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