Hibernate использует обновление, когда я пытаюсь вставить новые записи - PullRequest
0 голосов
/ 07 июня 2018

enter image description here

У меня есть структура базы данных, как указано выше.затем я пытался вставить новую запись с записью в формате ниже

{
    "userId": 2,
    "firstName": "project",
    "lastName": "principa;",
    "username": "principal1",
    "password": "$2a$04$eFytJDGtjbThXa80FyOOBuFdK2IwjyWefYkMpiBEFlpBwDH.5PM0K",
    "institution": {
        "institutionID": 3,
        "institutionName": "new_test_schoo;"
    },
    "authorities": [
        {
            "authorityID": 2,
            "authority": "principal"
        }
    ]
}

Затем из консоли и таблицы я вижу, что учреждение вставлено, но hibernate пытался выполнить обновление.

Hibernate: insert into users (first_name, institution_id, last_name, password, username) values (?, ?, ?, ?, ?)
Hibernate: update authorities set authority=?, user_id=? where authority_id=?

Я использовал следующий метод для вставки новой новой записи

@Override
public void saveUser(Users theUser) {
    Session currentSession = sessionFactory.getCurrentSession();
    currentSession.save(theUser);
}

А вот мой класс сущности Users

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="user_id")
private int userId;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(name="username")
private String username;
@Column(name="password")
private String password;

@ManyToOne(cascade={CascadeType.DETACH, CascadeType.MERGE,CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name="institution_id")
private Institution institution;

@JsonManagedReference
@OneToMany(fetch=FetchType.EAGER,
            mappedBy="user", 
            cascade={CascadeType.ALL})
private List<Authorities> authorities;
...setters and getters

Понятно, что

  "authorities": [
        {
            "authorityID": 2,
            "authority": "principal"
        }
    ]

в таблице полномочий не существует, но почему hibernate пытается использовать обновление вместо вставки?И как я могу решить это?

Любая помощь будет оценена.

======================= Обновление ================================

Произошло быстрое обновление, я решил эту проблему, изменив CascadeType на CascadeType.ALL.Но я не чувствую, что это правильно.Как если бы я хотел удалить одного пользователя-подписчика, учреждение также будет удалено.Я прав?Но я попытался удалить @GeneratedValue и @Id.Это только выдает мне ошибку.И я не думаю, что @GeneratedValue повлияет на результат.Как будто я присваиваю Id, база данных будет хранить его отдельно.Однако, если я не назначу идентификатор, база данных сгенерирует его автоматически.

Есть идеи?

Ответы [ 4 ]

0 голосов
/ 09 июня 2018

Обнаружено потенциальное исправление.

Я переопределил класс Users в этом ниже

Я пытаюсь разделить шаги вставки, и теперь он работает нормально.И все теперь отлично работает.Спасибо за предоставленную помощь.

0 голосов
/ 07 июня 2018

У меня были проблемы с использованием аннотации @JsonManagedReference и @JsonBackReference в некоторых случаях (циклическая ссылка).

Попробуйте заменить на JsonIgnore и запустить метод saveAuthorities вручную.

0 голосов
/ 07 июня 2018

Если вы хотите установить идентификатор при вставке в Authority, вы должны удалить @GeneratedValue из объекта Authority.

0 голосов
/ 07 июня 2018

При каскадном включении в спящем режиме, если у каскадного объекта есть первичный ключ, который уже сохранен, Hibernate не сохранит новый объект.

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

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