如何在Micronaut中实现类似Grails的领域级多数据源配置
在Micronaut中为领域实体指定不同数据源
1. 配置多数据源
首先在application.yml中定义两个对应frontier和analytics的数据源:
datasources: frontier: url: jdbc:mysql://localhost:3306/your_db?createDatabaseIfNotExist=true&useSSL=false driverClassName: com.mysql.cj.jdbc.Driver username: db_user password: db_pass schema-generate: UPDATE dialect: MYSQL analytics: url: jdbc:mysql://localhost:3306/your_analytics_db?createDatabaseIfNotExist=true&useSSL=false driverClassName: com.mysql.cj.jdbc.Driver username: db_user password: db_pass schema-generate: UPDATE dialect: MYSQL
注:示例以MySQL为例,可根据实际数据库调整URL、驱动等参数;
schema-generate用于自动维护表结构,按需选择。
2. 为实体绑定对应Schema
在领域实体类上,通过注解指定对应的数据库schema:
Person实体(绑定frontier schema)
import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; @Entity @Table(name = "person", schema = "frontier") public class Person { @Id private String guid; private String name; // 省略getter、setter与构造方法 }
Event实体(绑定analytics schema)
import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; @Entity @Table(name = "person_event", schema = "analytics") public class Event { @Id private String guid; private String action; // 省略getter、setter与构造方法 }
3. 为Repository绑定指定数据源
每个Repository需通过@Repository注解的value属性关联对应数据源,确保该Repository的所有操作都使用指定数据源:
PersonRepository(使用frontier数据源)
import io.micronaut.data.annotation.Repository; import io.micronaut.data.jpa.repository.JpaRepository; @Repository("frontier") public interface PersonRepository extends JpaRepository<Person, String> { // 自定义查询方法 }
EventRepository(使用analytics数据源)
import io.micronaut.data.annotation.Repository; import io.micronaut.data.jpa.repository.JpaRepository; @Repository("analytics") public interface EventRepository extends JpaRepository<Event, String> { // 自定义查询方法 }
效果说明
配置完成后:
- 通过
PersonRepository执行的CRUD操作,会自动使用frontier数据源操作frontier.person表 - 通过
EventRepository执行的CRUD操作,会自动使用analytics数据源操作analytics.person_event表
完全实现你在Grails中指定数据源的效果。
补充:Micronaut Data JDBC场景
如果使用Micronaut Data JDBC而非JPA,只需替换实体与Repository的注解:
import io.micronaut.data.annotation.MappedEntity; import io.micronaut.data.annotation.Id; @MappedEntity(schema = "frontier", table = "person") public class Person { @Id private String guid; private String name; // 省略getter、setter }
import io.micronaut.data.annotation.Repository; import io.micronaut.data.jdbc.repository.JdbcRepository; @Repository("frontier") public interface PersonRepository extends JdbcRepository<Person, String> { }
内容的提问来源于stack exchange,提问作者Awesome
相关产品推荐
相关产品推荐

