powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA merge
15 сообщений из 15, страница 1 из 1
JPA merge
    #39493373
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плохо разбираюсь в хибернейте,
вот когда совсем не разбирался, по случайности добавил зачем-то

Код: java
1.
cascade = {CascadeType.MERGE, CascadeType.PERSIST}



полностью выглядит так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private int id;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private User user;

    private String county;

    @ManyToOne(fetch = FetchType.LAZY, optional=false, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    @JoinColumn(name = "region_id", referencedColumnName = "AOGUID")
    private AddressObject region;

    @ManyToOne(fetch = FetchType.LAZY, optional=false, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    @JoinColumn(name = "locality_id", referencedColumnName = "AOGUID")
    private AddressObject locality;

    ....

}




Сегодня столкнулся с такой проблемой, что если в detached объекте меняется locality и вызвать merge, то запись не обновляется, а создается новая. Битый час гуглил и никак не мог понять в чем проблема. Detached объект был с нужным id, в базе есть PK по этому полю, но он почему-то делает инсерт новой записи.

Через час колупания обратил внимание на эти записи и решил их удалить, так как они в моем случае не нужны. Даже не надеялся что это исправит проблему, но.. о чудо, все заработало.

Как это объяснить?
...
Рейтинг: 0 / 0
JPA merge
    #39493374
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гммм,
проблема именно в optional=false
если поле null и optional=false, он вместо обновления он создает новую запись. Это баг или фича?
...
Рейтинг: 0 / 0
JPA merge
    #39493380
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

Сейчас не могу посмотреть в доку, чтобы ответить. Но хочу обратить внимание на то что в JPA API и в Hibernate Session метод merge делает не одно и то же.
...
Рейтинг: 0 / 0
JPA merge
    #39493384
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettв detached объекте меняется locality и вызвать merge, то запись не обновляется, а создается новая
MERGE объединяет объекты.
locality_id у вас FK в базе
Значит сменив его вы фактически создали другой адрес и ОРМ объединил два объекта.
Один уже был = остался и Второй создали = INSERT
...
Рейтинг: 0 / 0
JPA merge
    #39493385
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettвот когда совсем не разбирался, по случайности добавил зачем-то
в большинстве случае, CASCADE ALL работает нормально.
...
Рейтинг: 0 / 0
JPA merge
    #39493390
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте убрать optional и cascade :
Код: java
1.
2.
3.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "locality_id", referencedColumnName = "AOGUID")
private AddressObject locality;
...
Рейтинг: 0 / 0
JPA merge
    #39493392
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Так объединил или создал другой? Причём тут внешний ключ, если объект по первичному ключу идентифицируется.
...
Рейтинг: 0 / 0
JPA merge
    #39493393
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

Да, уже, без опционал все нормально работает. Остался только вопрос - почему так?
...
Рейтинг: 0 / 0
JPA merge
    #39493397
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettПричём тут внешний ключ, если объект по первичному ключу идентифицируется.
Foregen Key для одного объекта - внешний, а для другого - первичный.
https://ru.wikipedia.org/wiki/Внешний_ключ
...
Рейтинг: 0 / 0
JPA merge
    #39493398
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123HettПричём тут внешний ключ, если объект по первичному ключу идентифицируется.
Foregen Key для одного объекта - внешний, а для другого - первичный.
https://ru.wikipedia.org/wiki/Внешний_ключ

Проблема именно с этим entity. Внешний ключ, к тому же, не обязательно на первичный может ссылаться. Достаточно чтобы поле содержало юник констрейт
...
Рейтинг: 0 / 0
JPA merge
    #39493401
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettВнешний ключ, к тому же, не обязательно на первичный может ссылаться. Достаточно чтобы поле содержало юник констрейт
Но у тебя же в entity_id пишется PK?
Мало ли что в Африке бывает?
Я знаю кучу провайдеров, которые работают только с PK.
...
Рейтинг: 0 / 0
JPA merge
    #39493402
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,
Давно бы базу привёл.
Удачи!
...
Рейтинг: 0 / 0
JPA merge
    #39493403
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Хоть бы раз ты по существу написал. Проблему еще во втором посте решили, если ты не заметил.
...
Рейтинг: 0 / 0
JPA merge
    #39493404
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHett,

Сейчас не могу посмотреть в доку, чтобы ответить. Но хочу обратить внимание на то что в JPA API и в Hibernate Session метод merge делает не одно и то же.

Разве? оО
...
Рейтинг: 0 / 0
JPA merge
    #39493405
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettPetro123,
Хоть бы раз ты по существу написал. Проблему еще во втором посте решили, если ты не заметил.
я отвечаю только на твою галиматью:
- что у тебя не PK
- что ты не менял объект
И твой вопрос - почему так происходит.
Если ты заметил, то ты тыркаешь аннотации ОРМ как телёнок уже второй раз за пол года.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA merge
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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