Я новичок в весенней загрузке, и сейчас я следую этому руководству (https://www.callicoder.com/spring-boot-rest-api-tutorial-with-mysql-jpa-hibernate/). Мне удалось создать api, который может запрашивать таблицу для getAll и addOne. Проблема в том, что он не использует существующую таблицу для этих запросов. Вместо этого мой код генерирует новую таблицу и выполняет запросы в этой таблице. Как настроить мой проект, чтобы он использовал мою исходную таблицу?
Таблица базы данных, которую я хотел бы использовать в качестве источника данных в этом примере. У меня есть одна строка данных, уже сохраненная в этой таблице.
mysql> show columns from palauteUser;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| userUUID | varchar(30) | NO | PRI | NULL | |
| firstName | varchar(30) | YES | | NULL | |
| lastName | varchar(30) | YES | | NULL | |
| email | varchar(30) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
Таблица базы данных, созданная весенним ботинком
mysql> show columns from palaute_user;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| useruuid | varchar(255) | NO | PRI | NULL | |
| email | varchar(255) | YES | | NULL | |
| first_name | varchar(255) | YES | | NULL | |
| last_name | varchar(255) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
Проекты pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fi.oppari.mysql.service</groupId>
<artifactId>SpringService</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringService</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
файл application.properties
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url = jdbc:mysql://localhost:3306/oppariDB?useSSL=false
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.show-sql=true
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update
server.port=9090
Модельный класс
package fi.oppari.mysql.service.SpringService.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "palauteUser")
public class PalauteUser {
@Id
private String userUUID;
@Column(name = "firstName")
private String firstName;
@Column(name = "lastName")
private String lastName;
@Column(name = "email")
private String email;
public String getUserUUID() {
return userUUID;
}
public void setUserUUID(String userUUID) {
this.userUUID = userUUID;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Интерфейс репозитория:
package fi.oppari.mysql.service.SpringService.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import fi.oppari.mysql.service.SpringService.model.PalauteUser;
@Repository
public interface PalauteUserRepository extends JpaRepository<PalauteUser, String>{
}
контроллер:
package fi.oppari.mysql.service.SpringService.controller;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import fi.oppari.mysql.service.SpringService.model.PalauteUser;
import fi.oppari.mysql.service.SpringService.repository.PalauteUserRepository;
@RestController
@RequestMapping("/api")
public class PalauteUserController {
@Autowired
PalauteUserRepository palauteUserRepository;
@GetMapping("/all")
public List<PalauteUser> getAll() {
System.out.println("Getting all");
return palauteUserRepository.findAll();
}
@PostMapping("/addOne")
public PalauteUser addUser(@Valid @RequestBody PalauteUser user) {
return palauteUserRepository.save(user);
}
}
После команды mvn spring-boot: run я использую postman с GET localhost: 9090/api/all, который возвращает пустой массив. POST localhost: 9090/api/addOne с данными json также является успешным, и он добавляет информацию в таблицу palaute_user.
Любые советы приветствуются по этой проблеме, и я заранее за них благодарю! :)
Поместите следующую строку в свой application.properties
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Первая рекомендация, как сказал Маруф, заключается в изменении стратегии именования. Это потому, что Spring конвертирует palauteUser
в palate_user
и пытается найти эту таблицу в БД.
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Вторая рекомендация - избавиться от генерации auto ddl:
#spring.jpa.hibernate.ddl-auto = update
Вместо этого я рекомендую вам использовать контроль версий базы данных, такой как FlyWay или Liquibase. Самый простой - это FlyWay, и вы должны добавить его в путь к классам (maven или graddle). Он автоматически загружается при запуске приложения, сравнивает последний файл, который у вас есть на /resources/db/migration/
и запускает все сценарии до тех пор, пока не совпадут версии. Вы увидите, что Flyway создает таблицу в БД для отслеживания версий, файлов и контрольных сумм.
@Table(name = "palauteuser")