Что такое имя таблицы?

P.K. спросил: 28 марта 2018 в 04:47 в: java

Я создаю приложение 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);
    }
}

Изменить: все ответы, данные до сих пор, вообще не помогают.


3 ответа

Anil Kumar ответил: 28 марта 2018 в 05:05

Следуйте имени пакета, если ваш основной класс находится в пакете com.example, тогда все пакеты в вашем приложении будут следовать этим пакетам, как для новой сущности, пакет будет com.example.entity

P.K. ответил: 28 марта 2018 в 05:06
Извините, вы говорите, что моя структура каталогов в настоящее время неверна?
Anil Kumar ответил: 28 марта 2018 в 05:18
Я говорю, чтобы проверить это один раз с вашего конца, как вы не опубликовали свой основной класс, я предполагаю, что это может быть причина
Anil Kumar ответил: 28 марта 2018 в 05:20
Как я вижу, вы не следите за структурой
P.K. ответил: 28 марта 2018 в 05:34
Ну, эта ссылка говорит, что структура не требуется. Так было бы хорошо, если бы я просто переместил файл основного класса наружу в com.example?
P.K. ответил: 28 марта 2018 в 07:51
Извините, это совсем не полезно! Я придерживаюсь той же структуры, что и в учебнике !!
UsamaAmjad ответил: 28 марта 2018 в 05:03

Вам нужно использовать правильные имена пакетов, так как я вижу, что класс Application и другие классы не соответствуют соглашению об именах пакетов.

Плюс Если я просто хочу вставить простые тестовые данные, я часто реализую . Реализации этого интерфейса запускаются при запуске приложения и могут использовать, например, ApplicationRunner для вставки некоторых тестовых данных.

Ваша реализация будет выглядеть следующим образом:

@Component
public class DataLoader implements ApplicationRunner {    @Autowired
    ThingsToDoRepository repository;    @Autowired
    public DataLoader(ThingsToDoRepository repository) {
        this.repository = repository;
    }    public void run(ApplicationArguments args) {
        repository.save(new ThingsToDo(1, 'TestUser1', 1));
        repository.save(new ThingsToDo(2, 'TestUser2', 0));
    }
}
john ответил: 28 марта 2018 в 05:13

Вы получаете эту ошибку, потому что нет таблицы с таким именем.

Вы можете попытаться добавить spring.jpa.hibernate.ddl-auto=create-drop в ваш файл .properties. Затем каждый раз, когда вы запускаете свое приложение, оно должно генерировать эту таблицу, используя вашу сущность.

Или вам нужно создать таблицу с именем things_to_do вручную, а затем, когда вы запустите свое приложение, оно должно работать , Для этого вам нужно добавить

/src/main/resources/schema.sql

create table things_to_do
(
   id integer not null,
   /*all the rest columns */
);

Другое дело, что Spring найдет ваши компоненты (например, репозиторий или сервис и т. д.) сканирует пакеты. И автоконфигурации сканируют пакет, в котором расположен ваш основной класс, и все вложенные пакеты.

Поэтому, если вы не хотите вручную устанавливать, где расположены ваши классы, вам нужно следовать этой структуре!

Пример:

my.main.package // here is your main class
my.main.package.entities // here are your entities
my.main.package.repositories // your repos
my.main.package.services // services

Это всего лишь пример, это не значит, что вы должны указывать одинаковые имена, просто следуйте соглашению. Надеюсь, понятно, что я имею в виду под структурой пакета:)

P.K. ответил: 28 марта 2018 в 04:55
Но я использую базу данных H2. Итак, разве таблицы не создаются автоматически? Мое понимание неверно? Кроме того, я все еще получаю ту же ошибку, к сожалению. (Во всяком случае, я пробовал это раньше).
john ответил: 28 марта 2018 в 04:58
Полагаю, вам нужно предоставить код основного класса для весенней загрузки. Тот, с основным методом. Я полагаю, вам не хватает некоторых конфигов. Тогда я мог бы обновить свой ответ.
P.K. ответил: 28 марта 2018 в 05:03
Обновил это. Также добавили код.
john ответил: 28 марта 2018 в 05:06
Я проверю. Я также обновил свой ответ, вы можете попробовать добавить schema.sql и проверить, имеет ли это значение.
P.K. ответил: 28 марта 2018 в 05:07
Попался. Спасибо.