Spring Boot с использованием save никогда не вставляет строки в таблицу Postgresql - PullRequest
0 голосов
/ 29 марта 2020
  1. Описание проблемы:

Я не могу сохранить новую запись в моей таблице. Я прошел несколько уроков, прежде чем решил попробовать выполнить эту задачу, и все заработало. Мне удалось отлично выполнить следующий урок, также используя PostgreSQL https://www.callicoder.com/spring-boot-flyway-database-migration-example/

Проблема возникла, когда я начал использовать и WebController, и RestController. Использование метода controller.save () не добавляет новую строку. Когда я пытаюсь запустить его, я получаю следующую ошибку

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

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: A different object with the same identifier value was already associated with the session : [com.example.joke4u.Joke#1]; nested exception is javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.example.joke4u.Joke#1]] with root cause
То, что я пробовал:

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

Я пытался использовать оба (obv не оба одновременно)

@GeneratedValue(strategy = GenerationType.TABLE)

и

@GeneratedValue(strategy = GenerationType.AUTO)

Ни один из них не меняет результат

Код:

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));
}

Полный класс данных Шутка:

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

@NotNull
private int 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(int categoryid, String content) {
    this.setCategoryid(categoryid);
    this.setContent(content);
}

public Joke(long id, int categoryid, String content) {
    this(categoryid, content);
    this.id = id;
}

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

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

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

public void setCategoryid(int 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;
}

public void incrementLikes() {
    ++likes;
}

public void decrementLikes() {
    --likes;
}

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

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

public void incrementDislikes() {
    ++dislikes;
}

public void decrementDislikes() {
    --dislikes;
}

@Override
public String toString() {
    return "{" + " id='" + getId() + "'" + ", categoryid='" + getCategoryid() + "'" + ", content='" + getContent()
            + "'" + ", likes='" + getLikes() + "'" + ", dislikes='" + getDislikes() + "'" + "}";
}}

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

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

Редактировать: Я нашел некоторые хорошие новости! Я могу вставить в мою базу данных столько строк, сколько я хочу, но только если я ничего не вставляю, используя файл данных. sql. Задача требует, чтобы я это сделал: (

Ответы [ 2 ]

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

Кто-то помог мне добраться до моего ответа. Я так невероятно благодарен. Решение здесь. Невозможно использовать save () для вставки при предыдущем импорте данных с использованием данных. sql

Если вы не хотите go там и просто хотите это исправить. Для меня это исправило лишь изменение GenerationType не на AUTO, TABLE или SEQUENCE, а на IDENTITY.

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

У меня был похожий случай.

Я использовал

@GeneratedValue(strategy = GenerationType.SEQUENCE

Затем в своем файле данных. sql Я использовал последовательность для добавления данных. Это увеличивает последовательность.

Это для postgreSQL:

INSERT INTO joke(id, categoryid, content )
VALUES (nextval('hibernate_sequence'), 1, 'joke');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...