我正在练习/学习一些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中提供。
我错过了什么?请帮忙!
这是因为您使用的是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