当前位置: 首页 > 知识库问答 >
问题:

Spring Boot JPA:JPA似乎可以自动创建表,但不确定在哪里

戚建德
2023-03-14

我正在练习/学习一些Spring Boot JPA应用程序,并在尝试保存到数据库表时不断遇到问题。

虽然我提供了@table注释,但JPA似乎是自动生成表名的。

我有一个简单的POJO,标有@Entity

@Entity
@Table(name="SongList")
public class SongList {

    @Id
    private Integer id;
    private String album;
    private String artist;
    private String title;

//Getter and Setter Methods 
}

扩展JPA CrudRepository的接口

import org.springframework.data.repository.CrudRepository;

public interface songRepo extends CrudRepository<SongList,Integer> {
}

设置数据源属性的属性yml文件

spring:
  datasource:
    driverClassName : com.mysql.cj.jdbc.Driver
    url :  jdbc:mysql://localhost:3306/Songdb
    username : root
    password : learning

jpa:
    hibernate.ddl-auto : update
    generate-ddl  : false
    show-sql : true

最后是测试类:

@SpringBootTest
@RunWith(SpringRunner.class)
class DataJpaApplicationTests {

    @Autowired
    ApplicationContext context;

    @Test
    void saveSongs() {

        songRepo repo = (songRepo) context.getBean(songRepo.class);

        SongList songs = new SongList();
        songs.setId(4);
        songs.setTitle("High Hopes");
        songs.setAlbum("Panic! At the Disco");

        repo.save(songs);

    }

}

运行测试类时,我的测试失败,出现错误:

ERROR:
org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: java.sql.SQLSyntaxErrorException: Table 'songdb.song_list' doesn't exist

我的数据库表已经存在。数据库名为Songdb(不是Songdb),表名为SongList。

我不确定表名'song_list'在哪里被注入,为什么我的库名是'songdb'而不是'sondb'在url中提供。

我错过了什么?请帮忙!

共有1个答案

岳迪
2023-03-14

这是因为您使用的是Spring Boot提供的默认命名策略。Hibernate使用物理策略和隐式策略映射字段名称。Hibernate使用物理命名策略将我们的逻辑名称映射到SQL表及其列。Spring Boot为这两种策略提供了默认值spring.jpa.hibernate.naming.physical-策略默认值为org.springframework.boot.orm.jpa.hibernate.Spring物理命名策略,spring.jpa.hibernate.naming.implicit-策略默认值为org.springframework.boot.orm.jpa.hibernate.

spring boot的默认命名策略将:

  • 用下划线替换点

您可以通过设置属性来更改它,如下所示:

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

对你来说,仅仅改变物理命名策略就能解决你的问题。你也可以使用org。冬眠cfg。EJB3NamingStrategy,它将保留提供的表名。既然你知道了问题的原因,你可以随心所欲地解决它。

您可以像在需要更多控制的情况下一样自定义物理命名策略。阅读:Hibernate命名策略更改表名

 类似资料:
  • 问题内容: 已解决:问题是Wingware Python IDE。我想现在自然而然的问题是,这是怎么可能的以及如何解决。 昨天我问了一个问题Python中的multiprocessing.Pool问题,这个问题几乎相同,但是我发现它似乎可以在Windows计算机上运行,​​而不能在我的Ubuntu上运行。在本文的结尾,我将发布执行相同功能的代码的稍有不同的版本。 我的问题的简短摘要:在Python

  • 问题内容: 我刚刚意识到DBUnit本身不会创建表(请参阅如何在不面对NoSuchTableException的情况下使用具有普通JDBC和HSQLDB的DBUnit进行测试?)。 DBUnit有什么方法可以根据数据集或dtd自动创建表吗? 编辑: 为了简单测试像HSQLDB这样的内存数据库,可以使用粗略的方法来自动创建表: 问题答案: 并不是的。正如您链接的答案所指出的那样,dbunit xml

  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 7年前关闭。 我有带有Hibernate和Spring框架的Maven项目。我希望Hibernate自动创建表,但是只是删除所有现有表,并且不创建所需的表。在会话工厂初始化期间不会引发任何异常,但是当我

  • 我的问题是:为什么我不能自动连接我的地图与接口,而我可以与实现? 多谢了。

  • 这看起来很奇怪,因为可以自动生成这些迁移(例如,像django一样),而且令人惊讶的是,V1的create-commands是自动生成的,但是如果我以后添加一个表,我必须手动键入命令。 那么,我是错过了它,还是我真的必须编写迁移?

  • 我有一个使用jpa hibernate的项目。我有一种坚持。xml文件,并希望它自动在数据库中创建表。我已正确指定了所有属性。日志中显示了所有sql语句,但数据库中仍然没有表。有没有人能解决这个问题?我已经搜索了几乎所有与我的问题相关的链接,但都没有找到答案。 这是我的persistence.xml 这就是我在控制台上得到的 16: 35:48881信息[org.hibernate.annotat