Мне очень жаль, если я не могу начать другую запись, связанную с моей предыдущей, но мой вопрос несколько другой.
Я заметил, что действительно могу сохранять новые данные в своей базе данных так долго поскольку я никогда не добавлял данные в базу данных с помощью строки 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);
}