Java 表名是什么?

Java 表名是什么?,java,spring-boot,database-connection,database-connectivity,Java,Spring Boot,Database Connection,Database Connectivity,我正在使用H2数据库创建一个Spring引导应用程序。我经常遇到以下错误: 未找到“要做的事情”表;SQL语句: 将值(1,'TestUser1',1)[42102-197] 而且,我觉得这是合乎逻辑的,因为我不知道在应用程序中在哪里传递这个表名。另外,表名应该是什么-表必须有特定的名称吗 我的ThingsToDo.java如下所示: package me.hiboy.springboot.microservice.example.todo; import javax.persistence.

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

未找到“要做的事情”表;SQL语句:
将值(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;
    }
}
存储库内容存储库是:

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

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

您会遇到此错误,因为没有具有此名称的表

您可以尝试将
spring.jpa.hibernate.ddl auto=create drop
添加到
.properties
文件中。然后,每次运行应用程序时,它都应该使用您的实体生成该表

或者,您需要手动创建一个名为
things\u to\u 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

这只是一个例子,它并不意味着你应该提供相同的名字,只是按照惯例。希望清楚我所说的包结构是什么意思:)

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

另外,如果我只想插入简单的测试数据,我通常会实现一个
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));
    }
}
请按照下面的说明使用包名称 如果您的主类在com.example包中 然后应用程序中的所有包都将遵循此包 对于新实体,该包将是
实体

通常,您会通过实体名称引用表,而不是实际的表名称。在这种情况下,这将是一件非常重要的事情

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

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

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

但我使用的是H2数据库。那么,这些表不是自动创建的吗?我的理解不对吗?不幸的是,我仍然会遇到同样的错误。(无论如何,我以前也试过这个方法)。我想您也需要提供spring boot主类代码。有主要方法的那个。我猜你错过了一些配置。然后我可以更新我的答案。我会检查。我还更新了我的答案,您可以尝试添加
schema.sql
,并检查它是否有任何区别。明白了。谢谢。好吧,我遵循的结构与教程中给出的完全相同。对不起,你是说我的目录结构目前是错误的吗?我是说要从你这边验证一下,因为你没有发布你的主类。我猜这可能是原因,因为我看到你没有遵循结构,表示不需要结构。所以,如果我只是将主类文件移到com.example之外,我会很好吗?对不起,这一点都没有帮助!我遵循教程中给出的相同结构!!
@Entity
@Table(name="things_to_do")
public class ThingsToDo {