下面是详细讲解“jpa多数据源时Hibernate配置自动生成表不生效的解决”的完整攻略。
背景
在使用JPA进行多数据源配置时,我们可能会遇到一个问题:配置了Hibernate自动生成表的语句,但是在应用启动时并没有执行SQL脚本,表也没有自动创建出来。这可能让人感到困惑,本文提供了一个可行的解决方案。
问题分析
首先,我们需要明确一点,如果在单数据源的情况下,我们只需要在配置文件application.properties中配置以下两个属性:
#开启JPA自动创建表功能
spring.jpa.hibernate.ddl-auto=update
#指定JPA生成实体类的方式为数据表
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
然后应用启动时,Hibernate会访问数据库并自动创建表。
但是,在多数据源的情况下,我们需要在多个数据库上执行这些操作,配置起来就比较复杂了。同时,我们需要确保每个数据源的表结构都能够正确生成。
解决方案
解决方案就是手动将每个数据源的实体类映射到Hibernate中,然后手动建表。
第一步:手动映射实体类
我们需要在每个数据源上,为每个实体类(Entity)手动添加注解,标明它们是属于哪个数据源的。具体的注解,根据不同的数据源类型而不同。例如,对于MySQL而言,可以使用以下注解:
@Entity
@Table(name = "person", catalog = "db_demo")
其中,person是表名,db_demo是目标数据源的名字。
同样的,我们也可以为每个数据源指定不同的生成策略:
hibernate.hbm2ddl.auto=create
这样,Hibernate会在启动时自动创建表。
第二步:手动建表
手动映射实体类后,我们需要在每个数据源上手动建表。如果使用MySQL,可以执行以下语句:
CREATE TABLE person (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL,
phone VARCHAR(32) NOT NULL,
PRIMARY KEY (id)
);
这样,每个数据源的表结构就可以正确创建出来了。
示例
下面是两个示例,分别针对MySQL和PostgreSQL的多数据源配置。
示例一:MySQL多数据源配置
我们假定有两个数据源,db_demo1和db_demo2,它们各自包含一个person表。对应的数据库名字分别为db_demo1和db_demo2。
首先,需要在配置文件中声明数据源:
spring.datasource.db_demo1.url=jdbc:mysql://localhost:3306/db_demo1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.db_demo1.username=root
spring.datasource.db_demo1.password=123456
spring.datasource.db_demo2.url=jdbc:mysql://localhost:3306/db_demo2?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.db_demo2.username=root
spring.datasource.db_demo2.password=123456
然后,我们需要在每个数据源上手动配置实体类。假设Person是我们的实体类,我们需要为每个数据源添加注解:
@Entity
@Table(name = "person", catalog = "db_demo1")
public class Person {
//...
}
@Entity
@Table(name = "person", catalog = "db_demo2")
public class Person {
//...
}
最后,在配置文件中为每个数据源指定生成策略:
spring.jpa.hibernate.ddl-auto=create
这样,应用启动时就会在每个数据源上自动创建表。
示例二:PostgreSQL多数据源配置
假定有两个数据源,db_demo1和db_demo2,它们各自包含一个person表。对应的数据库名字分别为db_demo1和db_demo2。
首先,需要在配置文件中声明数据源:
spring.datasource.db_demo1.url=jdbc:postgresql://localhost:5432/db_demo1
spring.datasource.db_demo1.username=postgres
spring.datasource.db_demo1.password=123456
spring.datasource.db_demo2.url=jdbc:postgresql://localhost:5432/db_demo2
spring.datasource.db_demo2.username=postgres
spring.datasource.db_demo2.password=123456
然后,我们需要在每个数据源上手动配置实体类,同样是对Person类添加注解:
@Entity
@Table(name = "person", schema = "public")
public class Person {
//...
}
最后,指定DDL策略:
spring.jpa.hibernate.ddl-auto=create
这样,应用启动时就会在每个数据源上自动创建表。
结束语
通过手动映射实体类,我们可以在多个数据源上实现正确地自动创建表的功能。只要在配置文件中声明数据源,并配置好DDL策略,就可以在应用启动时自动建表。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jpa多数据源时Hibernate配置自动生成表不生效的解决 - Python技术站