【问题标题】:What is the table name?表名是什么?
【发布时间】:2018-10-02 04:37:23
【问题描述】:

我正在使用 H2 数据库创建一个 Spring Boot 应用程序。我经常收到以下错误:

未找到表“THINGS_TO_DO”; SQL 语句:
插入 things_to_do (id, name, verify) 值 (1, 'TestUser1', 1) [42102-197]

而且,我觉得这是合乎逻辑的,因为我不知道在应用程序中在哪里传递这个表名。另外,表名应该是什么 - 表必须有一些特定的名称吗?

我的 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 是必需的 - 如果是的话,请让我知道,我也会发布。谢谢。

编辑: 带有 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);
    }
}

编辑:到目前为止给出的所有答案都没有帮助。

【问题讨论】:

    标签: java spring-boot database-connection database-connectivity


    【解决方案1】:

    按照包名作为 如果您的主类在 com.example 包中 那么你的应用程序中的所有包都将遵循这个包 至于新实体,包裹将是 com.example.entity

    【讨论】:

    • 对不起,你是说我目前的目录结构不对?
    • 我说要从你的最后验证一次,因为你没有发布你的主要课程我猜这可能是原因
    • 正如我所见,你没有遵循结构
    • 好吧,this link 说不需要结构。那么,如果我只是将主类文件移到 com.example 之外,我会好吗?
    • 对不起,这根本没有帮助!我遵循教程中给出的相同结构!!
    【解决方案2】:

    您需要使用正确的包名称,因为我可以看到您的应用程序类和其他类不遵循包命名约定。

    另外,如果我只想插入简单的测试数据,我通常会实现 ApplicationRunner。此接口的实现在应用程序启动时运行,并且可以使用例如autowired repository 插入一些测试数据。

    您的实现将如下所示:

    @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));
        }
    }
    

    【讨论】:

      【解决方案3】:

      您收到此错误是因为没有具有该名称的表。

      您可以尝试将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
      

      这只是一个示例,并不意味着您应该提供相同的名称,只需遵循约定即可。希望清楚我所说的包结构是什么意思:)

      【讨论】:

      • 但是我使用的是 H2 数据库。那么,表不是自动创建的吗?我的理解不正确吗?另外,不幸的是,我仍然遇到同样的错误。 (无论如何,我以前尝试过)。
      • 我猜你也需要提供spring boot主类代码。具有主要方法的一种。我猜你缺少一些配置。然后我可以更新我的答案。
      • 我会检查的。我也更新了我的答案,您可以尝试添加schema.sql 并检查它是否有任何不同。
      • 知道了。谢谢。
      • 嗯,我遵循的结构与教程中给出的完全相同。
      【解决方案4】:

      通常,您会通过实体名称而不是实际的表名称来引用您的表。在这种情况下,它将是 ThingsToDo。

      但在这种特殊情况下,您通过给您的实体另一个名称来覆盖它:

      @Entity
      @Table(name="things_to_do")
      public class ThingsToDo {
      

      这就是为什么您应该在查询中使用“things_to_do”,或者删除 name 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多