Quarkus Panache始终使用默认数据源而非指定数据源求助
问题解决:Quarkus多数据源下Repository指定数据源仍使用默认数据源
问题根源
默认情况下,Quarkus的Hibernate ORM会创建一个<default>持久化单元,自动扫描所有@Entity注解的类,并绑定到默认数据源。你的CashPostgres实体被这个默认PU扫描到,但默认数据源是MySQL,而cash_postgres表仅存在于PostgreSQL中,因此触发Schema验证失败。
解决方案
需要为每个数据源配置独立的Hibernate ORM持久化单元,明确指定每个PU对应的实体类,避免默认PU跨数据源扫描实体。
1. 修改application.properties配置
移除全局默认数据源,为每个命名数据源绑定专属的持久化单元,并指定要扫描的实体类/包:
# MySQL数据源配置 quarkus.datasource."mysqldatasource".db-kind=mysql quarkus.datasource."mysqldatasource".username=root quarkus.datasource."mysqldatasource".jdbc.url=jdbc:mysql://localhost:3307/mysqldb # PostgreSQL数据源配置 quarkus.datasource."postgresqldatasource".db-kind=postgresql quarkus.datasource."postgresqldatasource".username=user quarkus.datasource."postgresqldatasource".password=password quarkus.datasource."postgresqldatasource".jdbc.url=jdbc:postgresql://localhost:5431/postgresdb # MySQL对应的Hibernate持久化单元 quarkus.hibernate-orm."mysqlpu".datasource=mysqldatasource # 方式1:指定实体所在包(如果实体分包存放) # quarkus.hibernate-orm."mysqlpu".packages=com.yourproject.entity.mysql # 方式2:直接指定实体类(更精准) quarkus.hibernate-orm."mysqlpu".classes=com.yourproject.CashMySQL quarkus.hibernate-orm."mysqlpu".database.generation=validate # PostgreSQL对应的Hibernate持久化单元 quarkus.hibernate-orm."postgrespu".datasource=postgresqldatasource quarkus.hibernate-orm."postgrespu".classes=com.yourproject.CashPostgres quarkus.hibernate-orm."postgrespu".database.generation=validate quarkus.http.port=8080
2. 调整Repository类绑定持久化单元
将Repository与对应的持久化单元绑定,替代原有的@DataSource注解(Hibernate ORM通过PU关联数据源):
@ApplicationScoped @PersistenceUnit("mysqlpu") public class CashMySQLRepository implements PanacheRepository<CashMySQL> {}
@ApplicationScoped @PersistenceUnit("postgrespu") public class CashPostgresRepository implements PanacheRepository<CashPostgres> {}
3. 简化资源类注入
由于Repository已绑定正确的PU,注入时无需额外指定@DataSource:
@Path("/benchmark") public class MyResource { @Inject CashMySQLRepository cashMySQLRepository; @Inject CashPostgresRepository cashPostgresRepository; }
关键注意事项
- 确保每个持久化单元只扫描对应数据源的实体类,避免交叉扫描
- PanacheRepository依赖Hibernate持久化单元绑定数据源,仅用
@DataSource无法完全隔离实体与数据源的关联 - 若使用
PanacheRepositoryBase,同样需要通过@PersistenceUnit指定对应的PU
内容的提问来源于stack exchange,提问作者Hzt
相关产品推荐
相关产品推荐

