Я создаю приложение Spring Boot с использованием базы данных H2. Я постоянно получаю следующую ошибку:
Таблица "THINGS_TO_DO" не найдена; Оператор SQL: вставить в объекты__и_до (id, name, verified) значения (1, 'TestUser1', 1) [42102-197]
И я считаю, что это логично, так как Я не знаю , где передать это имя таблицы в приложении. Кроме того, каким должно быть имя таблицы - есть ли какое-то конкретное имя, которое должна иметь таблица?
My ThingsToDo.java выглядит следующим образом:
package me.hiboy.springboot.microservice.example.todo;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name="things_to_do")
public class ThingsToDo { @Id
private Long id; @Column(name="name")
private String name; @Column(name="verified")
private int verificationStatus; private String task; public ThingsToDo() { } public ThingsToDo(Long id, String name, int verificationStatus, String task) {
super();
this.id=id;
this.name=name;
this.verificationStatus=verificationStatus;
this.task=task;
} public Long getId() {
return id;
} public String getName() {
return name;
} public int getVerificationStatus() {
return verificationStatus;
} public String getTask() {
return task;
}
}
контроллер ThingsToDoController.java выглядит следующим образом:
package me.hiboy.springboot.microservice.example.todo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ThingsToDoController { @Autowired
ThingsToDoRepository repository; @GetMapping("/")
public String index() {
return "Hello from the ToDo Controller\n";
} @GetMapping("/todo/{name}")
public ThingsToDo getThingsToDo(@PathVariable String name) {
ThingsToDo thingToDo=repository.findByName(name); return thingToDo;
}
}
Репозиторий ThingsToDoRepository:
package me.hiboy.springboot.microservice.example.todo;import org.springframework.data.jpa.repository.JpaRepository;public interface ThingsToDoRepository extends JpaRepository<ThingsToDo, Long> {
ThingsToDo findByName(String name);
}
Application.properties:
spring.application.name=todo-service
server.port=8080
spring.jpa.show-sql=true
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:mydb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.platform=h2
spring.datasource.initialize=true
data.sql:
insert into things_to_do (id, name, verified) values (1, 'TestUser1', 1);
insert into things_to_do (id, name, verified) values (2, 'TestUser2', 0);
Я не думаю, что требуется pom.xml
- в случае, если это так, любезно lemme знаю, и я тоже опубликую это. Спасибо.
Изменить: тот, у кого есть метод main (), находится здесь:
package me.hiboy.springboot.microservice.example.todo.springbootmicroservicetodoservice;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootMicroserviceTodoServiceApplication { public static void main(String[] args) {
SpringApplication.run(SpringBootMicroserviceTodoServiceApplication.class, args);
}
}
Изменить: все ответы, данные до сих пор, вообще не помогают.
Следуйте имени пакета, если ваш основной класс находится в пакете com.example, тогда все пакеты в вашем приложении будут следовать этим пакетам, как для новой сущности, пакет будет com.example.entity
Вам нужно использовать правильные имена пакетов, так как я вижу, что класс Application и другие классы не соответствуют соглашению об именах пакетов.
Плюс Если я просто хочу вставить простые тестовые данные, я часто реализую . Реализации этого интерфейса запускаются при запуске приложения и могут использовать, например,
ApplicationRunner
для вставки некоторых тестовых данных.Ваша реализация будет выглядеть следующим образом:
Вы получаете эту ошибку, потому что нет таблицы с таким именем.
Вы можете попытаться добавить
spring.jpa.hibernate.ddl-auto=create-drop
в ваш файл.properties
. Затем каждый раз, когда вы запускаете свое приложение, оно должно генерировать эту таблицу, используя вашу сущность.Или вам нужно создать таблицу с именем
things_to_do
вручную, а затем, когда вы запустите свое приложение, оно должно работать , Для этого вам нужно добавить/src/main/resources/schema.sql
Другое дело, что Spring найдет ваши компоненты (например, репозиторий или сервис и т. д.) сканирует пакеты. И автоконфигурации сканируют пакет, в котором расположен ваш основной класс, и все вложенные пакеты.
Поэтому, если вы не хотите вручную устанавливать, где расположены ваши классы, вам нужно следовать этой структуре!
Пример:
Это всего лишь пример, это не значит, что вы должны указывать одинаковые имена, просто следуйте соглашению. Надеюсь, понятно, что я имею в виду под структурой пакета:)
schema.sql
и проверить, имеет ли это значение.