我正在使用H2数据库创建一个Spring Boot应用程序。我经常收到以下错误:
未找到表“THINGS_TO_DO”; SQL语句:
插入things_to_do(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;
}
}
Repository 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);
}
}
编辑:到目前为止给出的所有答案都没有任何帮助。
答案 0 :(得分:1)
按照包名称 如果您的主类位于com.example包中 然后,您的应用程序中的所有包都将遵循此包 对于新实体,包将是 com.example.entity
答案 1 :(得分:0)
您收到此错误,因为没有包含此名称的表。
您可以尝试将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 */
);
另一件事是,为了找到你的组件(比如存储库或服务等),它会扫描包。并且自动配置扫描主类所在的包和所有嵌套包。
因此,如果您不想手动设置类所在的位置,则需要遵循此结构!
示例:
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
这只是一个例子,它并不意味着你应该提供相同的名称,只需按照惯例。希望很清楚我的意思是包结构:)
答案 2 :(得分:0)
您需要使用正确的软件包名称,因为我可以看到Application类和其他类不遵循软件包命名约定。
另外如果我只想插入简单的测试数据,我经常会实现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 :(得分:0)
通常,您会通过实体名称而不是实际的表名称来引用您的表。在这种情况下,它将是 ThingsToDo。
但在这种特殊情况下,您通过为实体提供另一个名称来覆盖这一点:
@Entity
@Table(name="things_to_do")
public class ThingsToDo {
这就是为什么您应该在查询中使用“things_to_do”,或者删除名称语句。