如何解决能否使Spring Boot JPA Hibernate应用程序自动创建具有必要列和来自JPA实体的关系的表?
我是一个新手,只了解Java Core的基础知识。我有测试任务,需要使用Spring Boot创建简单的REST Web服务。
我用Java Core编写了所有逻辑,现在我尝试将其包装在所有这些技术中。
我正在使用本指南:
https://spring.io/guides/tutorials/rest/
这里有JPA实体和@Table批注,其中指定了表名,但是在本指南中没有SQL脚本可以创建表。
所以我认为JPA会自行为实体创建数据库和表,但是当我取消注释@Table注释时,它说“无法解析表'
我在导入了Spring Web,H2和JPA的Spring Boot Maven项目中使用了IntelliJ IDEA(如指南所述)。
我还配置了H2数据源并测试了连接:工作正常。有一个架构,但是没有表。
这是我的application.properties:
spring.h2.console.enabled=true
spring.h2.console.path=/h2_console
spring.datasource.url=jdbc:h2:~/kaylemains
spring.datasource.platform=h2
spring.datasource.initialization-mode=always
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.generate-ddl=true
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto = update
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
如指南中所述,我在LoadDatabase类中添加实体,如下所示:
@Bean
CommandLineRunner initTournaments(TournamentRepository repository) {
return args -> {
log.info("Preloading " + repository.save(new Tournament("Kayle Mains Competition: Summoner's Gorge",16)));
};
}
所以我的问题是:我可以用我的Java代码存储文件H2数据库并对其进行所有操作(包括创建表)吗?
还是有必要手动创建表(通过使用CREATE TABLE编写SQL脚本)并构造它们,以便所有实体都能正常工作? (这意味着定义外键列等),只有在此之后,JPA才能使用此数据库?我是否需要在每个字段中添加@Column批注,而JPA本身不会为它的实体这样做?
为什么会出现“无法解析表”错误?当然,由于它尚不存在而无法解决,我认为JPA&Hibernate将根据实体类为我创建它。
解决方法
在Baeldung中,您具有有关要生成ddl的属性的所有信息
Spring提供了Hibernate用于生成DDL的JPA特定属性:spring.jpa.hibernate.ddl-auto。
创建 – Hibernate首先删除现有表,然后创建新表
更新 –将基于映射(注释或XML)创建的对象模型与现有模式进行比较,然后Hibernate根据差异更新模式。即使>应用程序不再需要它们,它也不会删除现有的表或列
创建-删除 –与create相似,另外,在所有操作完成后,Hibernate将删除数据库。通常用于单元测试 validate – Hibernate仅验证表和列是否存在,否则将引发异常
无 –此值有效地关闭了DDL生成
我们必须仔细设置值或使用其他机制之一 初始化数据库。
如果问题仍然存在,请转到“设置”->“检查”,然后取消选中“注释中未解决的数据库引用”选项
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。