Size: a a a

Java/Kotlin and more

2021 January 09

HH

Human Human in Java/Kotlin and more
А в настройках ты уже укажешь как на них реагировать.
источник
2021 January 10

C

Captcha bot in Java/Kotlin and more
Таисия Гурьева, если ты не бот, нажми "три". Ботов удалено: 398.
источник

AN

Alex Nikolaev in Java/Kotlin and more
Подскажите, пожалуйста, по аннотациям Hibernate. Есть таблицы Workout <- User, М:1. Как сделать такую Entity для Workout, чтобы с ней можно было так
Workout w = new Workout();
w.setUserId(2);
entityManager.persist(w);
w.getUser().doSmth();
Если сделать так:
class Workout {
...
@ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(nullable = false, name = "userId", insertable = false, updatable = false)
private User user;

private int userId;
...
}
То после persist поле user почему-то null, хотя если вытащить существующую Entity, то в ней всё ок.
источник

V

Vlad in Java/Kotlin and more
Alex Nikolaev
Подскажите, пожалуйста, по аннотациям Hibernate. Есть таблицы Workout <- User, М:1. Как сделать такую Entity для Workout, чтобы с ней можно было так
Workout w = new Workout();
w.setUserId(2);
entityManager.persist(w);
w.getUser().doSmth();
Если сделать так:
class Workout {
...
@ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(nullable = false, name = "userId", insertable = false, updatable = false)
private User user;

private int userId;
...
}
То после persist поле user почему-то null, хотя если вытащить существующую Entity, то в ней всё ок.
Метод персист не гарантирует мгновенное выполнение,  хибер просто помечает себе,  что нужно сделать.  Попробуй после персиста выполнить flush()
источник

AN

Alex Nikolaev in Java/Kotlin and more
Vlad
Метод персист не гарантирует мгновенное выполнение,  хибер просто помечает себе,  что нужно сделать.  Попробуй после персиста выполнить flush()
Спасибо за совет. Да, я уже попробовал, entityManager.flush(); также не помог. И тем более ведь id самого Workout нормально заносится в переменную после persist, даже без flush, то есть w.getId() нормально отрабатывает. Вот как бы с и полем user так же сделать...
источник

РН

Роман Нагаев... in Java/Kotlin and more
Alex Nikolaev
Подскажите, пожалуйста, по аннотациям Hibernate. Есть таблицы Workout <- User, М:1. Как сделать такую Entity для Workout, чтобы с ней можно было так
Workout w = new Workout();
w.setUserId(2);
entityManager.persist(w);
w.getUser().doSmth();
Если сделать так:
class Workout {
...
@ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(nullable = false, name = "userId", insertable = false, updatable = false)
private User user;

private int userId;
...
}
То после persist поле user почему-то null, хотя если вытащить существующую Entity, то в ней всё ок.
убери отдельное поле для userId, оставь только юзера, убери для него каскад  и insertable, updatable

присваивай пользователя через референс по id, после перзиста можно будет вытащить из поля с референсом уже настоящего пользователя

возможно понадобятся flush и refresh но это неточно
источник

AN

Alex Nikolaev in Java/Kotlin and more
Роман Нагаев
убери отдельное поле для userId, оставь только юзера, убери для него каскад  и insertable, updatable

присваивай пользователя через референс по id, после перзиста можно будет вытащить из поля с референсом уже настоящего пользователя

возможно понадобятся flush и refresh но это неточно
«присваивай пользователя через референс по id» — можно подробнее, как это? На всякий случай напишу, что я не хочу лишний раз вытаскивать пользователя, мне достаточно id для создания Workout
источник

РН

Роман Нагаев... in Java/Kotlin and more
Alex Nikolaev
«присваивай пользователя через референс по id» — можно подробнее, как это? На всякий случай напишу, что я не хочу лишний раз вытаскивать пользователя, мне достаточно id для создания Workout
если у тебя не выключены прокси в гибере то референс не вытянет пользователя при создании workout, однако непонятно почему тебя это беспокоит если ты позже всё равно будешь вытаскивать пользователя для операций над ним
референсы легко гуглятся
заодно советую погуглить жизненный цикл сущности
источник

AN

Alex Nikolaev in Java/Kotlin and more
Ага, спасибо, поищу про эти референсы. Дело в том, что я не всегда буду вытаскивать пользователя, сценарий без вытаскивания так же должен работать
источник

РН

Роман Нагаев... in Java/Kotlin and more
Роман Нагаев
если у тебя не выключены прокси в гибере то референс не вытянет пользователя при создании workout, однако непонятно почему тебя это беспокоит если ты позже всё равно будешь вытаскивать пользователя для операций над ним
референсы легко гуглятся
заодно советую погуглить жизненный цикл сущности
хмм, по поводу того что оно легко гуглится, я пожалуй погорячился, поэтому дам подсказку
EntityManager.getReference
источник

V

Vlad in Java/Kotlin and more
Alex Nikolaev
Подскажите, пожалуйста, по аннотациям Hibernate. Есть таблицы Workout <- User, М:1. Как сделать такую Entity для Workout, чтобы с ней можно было так
Workout w = new Workout();
w.setUserId(2);
entityManager.persist(w);
w.getUser().doSmth();
Если сделать так:
class Workout {
...
@ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(nullable = false, name = "userId", insertable = false, updatable = false)
private User user;

private int userId;
...
}
То после persist поле user почему-то null, хотя если вытащить существующую Entity, то в ней всё ок.
А как именно ты достаешь свой workout?
источник

V

Vlad in Java/Kotlin and more
Исходя из проблемы могу предположить,  что ты просто тянешь воркаут,  но не говоришь хиберу,  что хочешь еще и юзера(тк он lazy)
источник

AN

Alex Nikolaev in Java/Kotlin and more
Роман Нагаев
хмм, по поводу того что оно легко гуглится, я пожалуй погорячился, поэтому дам подсказку
EntityManager.getReference
Спасибо, с getReference всё вроде работает, без лишних запросов и даже без flush. Потом, как только достаю пользователя из workout и пытаюсь у него вытащить какое-нибудь поле, hibernate делает запрос, как и нужно. Странно, что если набрать в поисковике «hibernate set by reference» выходит совсем не то в начале, а не эта супер-фича
источник

AN

Alex Nikolaev in Java/Kotlin and more
Vlad
А как именно ты достаешь свой workout?
Я его создаю с нуля, как обычный объект
источник

V

Vlad in Java/Kotlin and more
Alex Nikolaev
Я его создаю с нуля, как обычный объект
Т.е после setUser и persist  у тебя просто зануляется поле юзер?
источник

AN

Alex Nikolaev in Java/Kotlin and more
Vlad
Т.е после setUser и persist  у тебя просто зануляется поле юзер?
Не понял, как это «зануляется». Я сам ничего не зануляю, я же привёл код. В нём просто null после persist. И я не setUser делаю, а setUserId
источник

СЕ

Сергей Ермаков... in Java/Kotlin and more
Alex Nikolaev
Не понял, как это «зануляется». Я сам ничего не зануляю, я же привёл код. В нём просто null после persist. И я не setUser делаю, а setUserId
А как можно сэтить айди хардкрдом, а если такой уже есть?
источник

AN

Alex Nikolaev in Java/Kotlin and more
Сергей Ермаков
А как можно сэтить айди хардкрдом, а если такой уже есть?
Это не id workout, а id связанной таблицы user. Как я написал в начале, у меня связь 1:М
источник

СЕ

Сергей Ермаков... in Java/Kotlin and more
Alex Nikolaev
Это не id workout, а id связанной таблицы user. Как я написал в начале, у меня связь 1:М
А разве он не подтянется?
источник

AN

Alex Nikolaev in Java/Kotlin and more
Сергей Ермаков
А разве он не подтянется?
Не понял, откуда он должен подтянуться? Id пользователя наоборот уже есть и я хочу его установить в свежесозданный Workout. На всякий случай напишу, что проблема уже вроде решена референсами
источник