Postgres项目中如何避免在JPA注解中指定information_schema?
问题:如何避免在JPA注解中重复指定schema参数?
我创建了一个基于PostgreSQL数据库的Spring项目,发现实体类对应的表被自动创建在了information_schema中,导致我必须在@Table或@JoinTable注解里手动添加schema参数才能正常映射,示例代码如下:
@Entity @Table(name = "book", schema = "information_schema") public class Book { ...
@ManyToMany @JoinTable( name = "book_genre", schema = "information_schema", joinColumns = @JoinColumn(name = "book_id"), inverseJoinColumns = @JoinColumn(name = "genre_id")) private List<Genre> genres = new ArrayList<>();
当前我的application.yml配置如下:
spring: datasource: url: "jdbc:postgresql://localhost:5432/postgres" username: ... password: ...
请问有没有办法通过修改应用配置来全局指定默认schema,避免每次在注解里重复设置?
解决方案
可以通过以下几种方式在配置中全局指定默认schema,无需在每个注解中手动添加:
- 在JDBC URL中指定默认schema
直接在PostgreSQL的JDBC连接URL末尾加上currentSchema参数,指定目标schema:
spring: datasource: url: "jdbc:postgresql://localhost:5432/postgres?currentSchema=information_schema" username: ... password: ...
这种方式会让JDBC连接默认使用指定的schema,JPA在创建表和执行查询时都会自动沿用这个schema。
- 通过Spring Data JPA配置全局默认schema
如果使用Spring Data JPA,可直接配置Hibernate的默认schema参数,在application.yml中添加:
spring: jpa: properties: hibernate.default_schema: information_schema
该配置会让Hibernate生成SQL语句时默认使用指定的schema,所有未单独设置schema参数的实体类都会自动使用这个全局配置。
- 设置数据库用户的默认schema
还可以通过修改PostgreSQL用户的默认schema,从底层解决问题:
ALTER USER your_username SET search_path TO information_schema;
执行这条SQL后,该用户每次连接数据库都会默认使用information_schema作为当前schema,应用端无需额外配置。
注意:
information_schema是PostgreSQL的系统schema,通常不建议在其中创建业务表,建议创建独立的业务schema(比如public或自定义的book_schema)存放业务数据,避免与系统表混淆。
内容的提问来源于stack exchange,提问作者Agatha Shevchenko
相关产品推荐
相关产品推荐

