Невозможно сохранить данные в таблицу (база данных H2) с помощью Spring-Data-JPA. ⇐ JAVA

Программисты JAVA общаются здесь
Anonymous
Невозможно сохранить данные в таблицу (база данных H2) с помощью Spring-Data-JPA.

Сообщение Anonymous »

Я использую базу данных H2 версии 2.2.224 и Spring-Data-JPA версии 3.3.3. У меня есть связь «многие ко многим» между таблицами «USERS» и «ROLES».
Когда я пытаюсь сохранить «Entity = USERS» в H2 База данных, я получаю следующую ошибку::
org.h2.jdbc.JdbcSQLSyntaxErrorException: невозможно назначить сгенерированный столбец «PUBLIC.USERS.USER_ID_PK».
Запрос SQL: вставить в пользователей (пароль, логин, user_id_pk) значения (?,?,?) [90154-224]
На мой взгляд, эта ошибка возникает из-за того, что Spring JPA сам генерирует идентификатор и пытается вставить этот идентификатор в саму базу данных, а H2
хочет сам сгенерировать идентификатор и вставить его в таблицу.
Если я создам столбец «user_id_pk» в «USERS» " такую ​​таблицу:: "user_id_pk целое число PRIMARY KEY" и измените GenerationType в "Entity = USERS", тогда возникнут различные ошибки.
  • GenerationType .AUTO :: объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед очисткой: Роли
  • GenerationType.SEQUENCE:: объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед очисткой: Роли
  • GenerationType.IDENTITY:: JdbcSQLIntegrityConstraintViolationException: NULL не разрешен для столбца «USER_ID_PK»;
Если я создам столбец «user_id_pk» в таблице «USERS» следующим образом:: role_id_pk целое число, СОЗДАННОЕ ПО УМОЛЧАНИЮ КАК ПЕРВИЧНЫЙ КЛЮЧ ИДЕНТИФИКАЦИИ, и изменю GenerationType в «Entity = USERS» , то возникают различные ошибки.
  • GenerationType.AUTO :: объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед сбросом: Роли
  • GenerationType.SEQUENCE:: объект ссылается на несохраненный временный экземпляр – сохраните временный экземпляр перед очисткой: Роли
  • GenerationType.IDENTITY:: объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед сбросом: Роли
Если я создам столбец «user_id_pk» в таблице «USERS» следующим образом:: role_id_pk целое число ГЕНЕРИРУЕТСЯ ВСЕГДА КАК ПЕРВИЧНЫЙ КЛЮЧ ИДЕНТИФИКАЦИИ и измените GenerationType в «Entity = USERS», тогда возникают различные ошибки.
  • GenerationType.AUTO :: Невозможно назначить созданный столбец «PUBLIC.USERS.USER_ID_PK».
  • GenerationType.SEQUENCE :: Сгенерированный столбец "PUBLIC.USERS.USER_ID_PK" не может быть назначен
  • GenerationType.IDENTITY:: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед очисткой : Роли
Я создаю ПОСЛЕДОВАТЕЛЬНОСТЬ вот так::
CREATE SEQUENCE USERS_SEQ START WITH 1 INCREMENT BY 50;

Мои таблицы::
CREATE TABLE PUBLIC.ROLES (
role_id_pk Integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
role VARCHAR
);

CREATE TABLE PUBLIC.USERS (
user_id_pk Integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
login VARCHAR,
password VARCHAR
);

Моя сущность::
@Entity
@Table(name = "users")
public class MyUser {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id_pk")
private Long id;

@Column(name = "login")
private String username;

@Column(name = "password")
private String password;

@ManyToMany
@JoinTable(name = "USERS_ROLES",
joinColumns = {@JoinColumn(name = "user_id_pk")},
inverseJoinColumns = {@JoinColumn(name = "role_id_pk")})
private List listRoles;

Моя сущность::
@Entity
@Table(name = "roles")
public class Roles {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "role_id_pk")
private Long id;

@Enumerated(EnumType.STRING)
@Column(length = 20, name = "role")
private ERole name;

@ManyToMany(mappedBy="listRoles")
private List myUsersList;


Подробнее здесь: https://stackoverflow.com/questions/791 ... g-data-jpa

Вернуться в «JAVA»