Не могу получить Hibernate для обновления объекта без исключения EntityExistException - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь установить двунаправленное отношение один к одному, и при обновлении AccountExtrasModel при первом сохранении все работает нормально, но при обновлении я получаю либо ошибку, либо операторы sql добавляют вставку, а затем удаляют вместо обновления.

import lombok.*;
import javax.persistence.*;

@ToString
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "Account")
public class AccountModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Account_ID;

    @Column(nullable = false, updatable = false)
    private String name;

    @Column(nullable = false, unique = true, updatable = false)
    private String email;

    @Column(nullable = false, updatable = false)
    private String password;

    @OneToOne(mappedBy = "accountModel", cascade = CascadeType.ALL, orphanRemoval = true)
    private AccountExtrasModel accountExtras;

    public AccountModel addExtras(AccountExtrasModel accountExtrasModel) {
        accountExtrasModel.setAccountModel(this);
        this.setAccountExtras(accountExtrasModel);
        return this;
    }
}

import lombok.*;
import javax.persistence.*;

@Setter
@Getter
@NoArgsConstructor
@ToString
@Entity
@Table(name = "AccountExtras")
public class AccountExtrasModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long ID;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    private AccountModel accountModel;

    @Lob
    private String description;
    private String[] myVideos;
    private String[] likedVideos;
    private String imageReference;
}

Если я изменю @MapsId на @JoinColumn в AccountExtrasModel, то получу желаемый результат, но при этом вставлю новую строку и свяжу ее с учетной записью, а затем удалю старую строку вместо обновления.

Это ошибка, которую я получаю:

{
    "timestamp": "2018-04-26T18:19:01.657+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "A different object with the same identifier value was already associated with the session : [com.alttube.account.models.AccountExtrasModel#1]; nested exception is javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.alttube.account.models.AccountExtrasModel#1]",
    "path": "/update_account"
}

Что я могу сделать, чтобы получить желаемый результат, который заключается в простом обновлении учетной записи ExtrasModel соответствующей учетной записи, к которой он принадлежит?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Если вы обновляете экземпляр AccountModel, устанавливая новый экземпляр AccountExtrasModel, как вы это делаете в addExtras(), то удаление + вставка является нормальным. Обновив идентификатор, вы закончите с осиротевшими записями.

Когда вы устанавливаете новые значения для экземпляра AccountExtrasModel, проверьте, инициализирована ли accountExtras. Если нет, то сделайте addExtras(). Если это так, не заменяйте его, просто измените его, чтобы hibernate сгенерировал обновление для таблицы extras (но оставил идентификатор записи без изменений).

0 голосов
/ 26 апреля 2018

Вместо использования метода save попробуйте использовать метод merge , потому что в случае наличия объекта в базе данных каркас будет обновить этот объект. Если объект не существует, фреймворк будет вставлен как обычно.

Привет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...