Невозможно использовать save () для вставки при предварительном импорте данных с использованием данных. sql - PullRequest
0 голосов
/ 30 марта 2020

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

Я заметил, что действительно могу сохранять новые данные в своей базе данных так долго поскольку я никогда не добавлял данные в базу данных с помощью строки spring.datasource.initialization-mode=always в моем application.properties и создал файл data. sql с несколькими операторами вставки. Вставив данные с помощью этого файла, я могу получить доступ к данным и показать их пользователю, но не могу создать новые данные, потому что я получаю следующую ошибку

ERROR: duplicate key value violates unique constraint "joke_pkey"
Detail: Key (id)=(1) already exists.

Кто-нибудь знает, как помочь мне с этим? Я выполняю задание на собеседование, и мне нужно сначала импортировать данные, используя файл данных. sql, а затем добавить еще несколько данных.

Сообщение с моим кодом находится здесь: Spring Boot использование save никогда не вставляет строку в таблицу Postgresql

EDIT - кто-то порекомендовал добавить сюда мой код напрямую и сказать, что я пробовал.

Я попытался инициализировать базу данных со свойствами приложения такими, как они есть, затем перезапустить приложение, но без последней строки и установить для spring.jpa.hibernate.ddl-auto значение none. Но даже в этом случае это не сработало. Я искренне ожидал, что это будет работать так. Потому что, если таблица пуста, и я заполняю ее, используя созданные мной функции, все работает как чудо, даже после перезапуска сервера (id сохраните значения от ring.jpa.hibernate.ddl-auto до none, чтобы предотвратить удаление данных)

Я также попытался просто изменить стратегию GenerationType.AUTO на GenerationType.TABLE в своем классе Шутки, но это тоже ничего не изменило.

application.properties:

spring.datasource.url=jdbc:postgresql://localhost:5432/flyway_demo
spring.datasource.username=bob
spring.datasource.password=bob123

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

spring.jpa.hibernate.ddl-auto=create
spring.datasource.initialization-mode=always

Мой веб-контроллер с функцией post:

@PostMapping("/post")
public String insertJoke(JokeForm jokeForm) {
    int categoryid = jokeForm.getCategoryId();
    String content = jokeForm.getContent();
    databasController.insert(categoryid, content);
    return "redirect:/";
}

Мой DBController, функция вставки которого вызывается

public Joke insert(int categoryid, String content) {
    return jokeRepository.save(new Joke(categoryid, content));
}

Большая часть моего класса данных Joke:

@Entity
public class Joke {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(columnDefinition = "serial")
private Long id;

@NotNull
@Column(name = "category_id_FK")
private long categoryId;

@NotBlank
private String content;

@Column(columnDefinition = "integer default 0")
private int likes = 0;

@Column(columnDefinition = "integer default 0")
private int dislikes = 0;

public Joke() {
}

public Joke(long categoryid, String content) {
    this.setCategoryid(categoryid);
    this.setContent(content);
}

// id
public Long getId() {
    return this.id;
}

// id
public void setId(Long id) {
    this.id = id;
}

// categoryid
public long getCategoryid() {
    return this.categoryId;
}

public void setCategoryid(long categoryid) {
    this.categoryId = categoryid;
}

// content
public String getContent() {
    return this.content;
}

public void setContent(String content) {
    this.content = content;
}

// likes
public int getLikes() {
    return this.likes;
}

public void setLikes(int likes) {
    this.likes = likes;
}

// dislikes
public int getDislikes() {
    return this.dislikes;
}

public void setDislikes(int dislikes) {
    this.dislikes = dislikes;
}

}

Хранилище Шутки:

@Repository
public interface JokeRepository extends JpaRepository<Joke, Integer> {
   Joke findById(long id);
   List<Joke> findByCategoryid(int categoryid);
}

1 Ответ

0 голосов
/ 30 марта 2020

Кажется, что все, что вам нужно сделать, это изменить GenerationType.AUTO на GenerationType.IDENTITY.

Причина этого - последовательность, которая может быть не синхронизирована c, если вы используете AUTO. Потому что тогда hibernate использует свою собственную последовательность вместо той, которую postgres создает при использовании serial.

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