- Описание проблемы:
Я не могу сохранить новую запись в моей таблице. Я прошел несколько уроков, прежде чем решил попробовать выполнить эту задачу, и все заработало. Мне удалось отлично выполнить следующий урок, также используя 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. Задача требует, чтобы я это сделал: (