Size: a a a

Spring Framework and more

2019 August 15

KS

Kamo Spertsyan in Spring Framework and more
Pavel Bukhmatov
Бинго. Ну вот, теперь осталось понять, как отучить хибернейт от этой ереси)
совсем пустяки остались, получается)
источник

PB

Pavel Bukhmatov in Spring Framework and more
Kamo Spertsyan
совсем пустяки остались, получается)
Все ещё не понятно на каком уровне возникает проблема, но есть догадка. Хибернейт в какой-то момент понимает, что у него в контексте запрашивается сущность, которая менялась, но где конкретно контролируется это проведение? И даже если найти это место, где его можно поменять и можно ли вообще?

Мне кажется тут проще логику разделить на провалидируй -> сохрани.
Потому что альтернатива скорее всего упрется в какой-нибудь хак, типо изменения проведения автоматического flush'а. Ну или ручная работа с транзакцией, как вариант. А оно вам надо, лезть в кишки хибера/jpa?)
источник

KS

Kamo Spertsyan in Spring Framework and more
Pavel Bukhmatov
Все ещё не понятно на каком уровне возникает проблема, но есть догадка. Хибернейт в какой-то момент понимает, что у него в контексте запрашивается сущность, которая менялась, но где конкретно контролируется это проведение? И даже если найти это место, где его можно поменять и можно ли вообще?

Мне кажется тут проще логику разделить на провалидируй -> сохрани.
Потому что альтернатива скорее всего упрется в какой-нибудь хак, типо изменения проведения автоматического flush'а. Ну или ручная работа с транзакцией, как вариант. А оно вам надо, лезть в кишки хибера/jpa?)
Не надо, конечно) меня просто смущает история с тем, что надо помнить всегда о том, что надо сначала провалидировать телефон, а потом сохранить. Но из двух зол я выберу эту, конечно
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Вы уверены, что у вас аннотация @Transactional вообще работает? Пробовали трейс-логирование включать транзакшинменеджера например?

Смущает вот это ваш кусок кода
@Service
@EnableTransactionManagement
class ShopServiceImpl : ShopService {


@EnableTransactionManagement на @Configuration классе ставится, а не на бине. Спринг, возможно, на бинах ее и не ищет..

А find* методы репозитория никак не виляют на сохранение сущностей. у вас просто транзакция не ролбекается, скорее всего. а сущности вы сами сохраняете. возможно даже неявно. например, вызвав любой setter на полученном перед этим объектом из БД.
источник
2019 August 16

М

Михаил in Spring Framework and more
Есть ощущение, что где-то транзакция не так работает, возможно из-за странного порядка сохранения - валидации, как будто объект персистится в контекст, но в базу попадает только при последующем обращении к ней, а это селект. Сам по себе хибернейт не может новую сущность создать, чудес не бывает
источник

KS

Kamo Spertsyan in Spring Framework and more
Ruslan Stelmachenko
Вы уверены, что у вас аннотация @Transactional вообще работает? Пробовали трейс-логирование включать транзакшинменеджера например?

Смущает вот это ваш кусок кода
@Service
@EnableTransactionManagement
class ShopServiceImpl : ShopService {


@EnableTransactionManagement на @Configuration классе ставится, а не на бине. Спринг, возможно, на бинах ее и не ищет..

А find* методы репозитория никак не виляют на сохранение сущностей. у вас просто транзакция не ролбекается, скорее всего. а сущности вы сами сохраняете. возможно даже неявно. например, вызвав любой setter на полученном перед этим объектом из БД.
Я проверяю БД непосредственно перед вызовом find - сущности нет, и сразу после - сущность есть. При этом если исключение происходит на какой-нибудь другой проверке, которая не связана с БД (например, количество символов в номере телефона), то транзакция нормально откатывается и в БД сущности никакой нет.

Строчку @EnableTransactionManagement я вычитал в каких-то туториалах. Помнится, без неё у меня не работали транзакции (в другом классе), а с ней всё починилось. Но здесь могу ошибаться.
источник

PG

Pavel Golov in Spring Framework and more
Всем привет! Кто знает, помогите плиз https://stackoverflow.com/questions/57516650/how-to-get-data-using-hibernate-in-many-to-many-relationship

Использую spring data для работы с данными
источник

Ю

Юрий in Spring Framework and more
всем привет,
источник

Ю

Юрий in Spring Framework and more
я делаю ресайз таким способом
источник

Ю

Юрий in Spring Framework and more
public BufferedImage resizeImage(byte[]  image,int scaledWidth, int scaledHeight){
       ByteArrayInputStream bais = new ByteArrayInputStream(image);
       BufferedImage inputImage = null;
       try {
           inputImage = ImageIO.read(bais);
       } catch (IOException e) {
           e.printStackTrace();
       }
       BufferedImage outputImage =  new BufferedImage(scaledWidth, scaledHeight, inputImage.getType());
       // scales the input image to the output image
       Graphics2D g2d = outputImage.createGraphics();
       g2d.drawImage(inputImage, 0, 0, scaledWidth, scaledHeight, null);
       g2d.dispose();

       return outputImage;
   }
источник

Ю

Юрий in Spring Framework and more
но  на фотках  нет сглаживания
источник

Ю

Юрий in Spring Framework and more
как вы  делаете ресайзы или что можно сделать в моем случае?
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Kamo Spertsyan
Я проверяю БД непосредственно перед вызовом find - сущности нет, и сразу после - сущность есть. При этом если исключение происходит на какой-нибудь другой проверке, которая не связана с БД (например, количество символов в номере телефона), то транзакция нормально откатывается и в БД сущности никакой нет.

Строчку @EnableTransactionManagement я вычитал в каких-то туториалах. Помнится, без неё у меня не работали транзакции (в другом классе), а с ней всё починилось. Но здесь могу ошибаться.
это еще не значит, что find вставляет сущность в БД. Он просто может делать flush тех изменений, что уже накопились в контексте хибернейта. хибернейт ведь генерит пачку инсертов и апдейтов не в момент того, как вы обновляете сущности, а только в моменты flush-ей. по-умолчанию этот момент - перед коммитом. но можно и вручную зафорсить.

а как вы проверяете факт появления данных в бд сразу после find? Ведь если find делается внутри сервис-метода, который открыл транзакцию, вы эту запись извне в БД не увидите, пока транзакция не закоммитится. Она будет видна только в рамках этой же транзакции.

по поводу @EnableTransactionManagement я же не говорил, что она не нужна. Я сказал, что она должна быть на @Configuration-классе, а не на @Service.
источник

KS

Kamo Spertsyan in Spring Framework and more
Ruslan Stelmachenko
это еще не значит, что find вставляет сущность в БД. Он просто может делать flush тех изменений, что уже накопились в контексте хибернейта. хибернейт ведь генерит пачку инсертов и апдейтов не в момент того, как вы обновляете сущности, а только в моменты flush-ей. по-умолчанию этот момент - перед коммитом. но можно и вручную зафорсить.

а как вы проверяете факт появления данных в бд сразу после find? Ведь если find делается внутри сервис-метода, который открыл транзакцию, вы эту запись извне в БД не увидите, пока транзакция не закоммитится. Она будет видна только в рамках этой же транзакции.

по поводу @EnableTransactionManagement я же не говорил, что она не нужна. Я сказал, что она должна быть на @Configuration-классе, а не на @Service.
Я проверяю селектом через консоль напрямую из базы. find делается внутри сервис-метода, который вызывается из другого сервис-метода, который в свою очередь помечен как @Transactional.

@Configuration-а у меня вообще нет в проекте..
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Kamo Spertsyan
Я проверяю селектом через консоль напрямую из базы. find делается внутри сервис-метода, который вызывается из другого сервис-метода, который в свою очередь помечен как @Transactional.

@Configuration-а у меня вообще нет в проекте..
и при этом вы проверяете в тот момент, когда дебаг еще висит внутри @Transactional-метода? т.е. транзакция еще не закоммичена?
источник

KS

Kamo Spertsyan in Spring Framework and more
Ruslan Stelmachenko
и при этом вы проверяете в тот момент, когда дебаг еще висит внутри @Transactional-метода? т.е. транзакция еще не закоммичена?
Да
источник

KS

Kamo Spertsyan in Spring Framework and more
Ruslan Stelmachenko
и при этом вы проверяете в тот момент, когда дебаг еще висит внутри @Transactional-метода? т.е. транзакция еще не закоммичена?
Я ловлю выполнение непосредственно на строчке с find, проверяю, выполняю только эту строчку и проверяю повторно. find - не последний стейтмент в методе.
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Ну значит у вас транзакция не работает.
если бы транзакция была активна, вы бы изменения, сделанные внутри нее, не увидели никаким клиентом.
источник

KS

Kamo Spertsyan in Spring Framework and more
Тогда непонятно, в чём проблема, потому что без find-ов у меня всё работает корректно. Любые excepion-ы роллбекают транзакцию целиком. Но если они происходят после find-ов, то сохранение магазина почему-то коммитится
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Сложно сказать. Как я уже предлагал, включите дебаг-логирования всего пакета org.springframework и посмотрите, открывается ли транзакция, коммитится ли, в какой момент и т.п.
источник