gpt4 book ai didi

java - 如何通过 Spring Boot 使用相同的实体连接 3 个数据库?

转载 作者:行者123 更新时间:2023-12-01 09:43:40 24 4
gpt4 key购买 nike

自上周以来我遇到了一个问题,我一直在到处寻找但没有找到解决方案......我是盲目的吗?

我目前正在使用 Spring Boot 开发 Java Web 应用程序。我有 3 个 Oracle 数据库,它们具有相同的结构,但数据不同,因为每个数据库都在特定的环境中工作。
我发现了许多关于“如何使用多个数据源”的提示,但它们都讨论了具有特定实体(例如“用户”和“订单”)的不同数据源。所以他们没有解决我的问题。

因为我的 3 个数据库具有相同的结构,所以我希望能够使用我的实体并在我的所有数据库上搜索结果。

所以我尝试像这样配置应用程序:

@Configuration
public class OracleConfiguration {

@Bean
@Primary
@ConfigurationProperties(prefix="datasource.recette")
public DataSource recetteDataSource() {
return DataSourceBuilder.create().build();
}

@Bean
@ConfigurationProperties(prefix="datasource.homologation")
public DataSource homologationDataSource() {
return DataSourceBuilder.create().build();
}

@Bean
@ConfigurationProperties(prefix="datasource.production")
public DataSource productionDataSource() {
return DataSourceBuilder.create().build();
}
}

并将配置参数放入我的 application.yml 中:

# Hibernate configuration
spring:
jpa:
database-platform: org.hibernate.dialect.Oracle10gDialect
datasource:
# Oracle configuration for "recette" database
recette:
url: "myURL_recette"
username: "userR"
password: "pwdR"
driver-class-name: "oracle.jdbc.OracleDriver"

# Oracle configuration for "homologation" database
homologation:
url: "myURL_hom"
username: "userH"
password: "pwdH"
driver-class-name: "oracle.jdbc.OracleDriver"

# Oracle configuration for "production" database
production:
url: "myURL_Prod"
username: "userP"
password: "pwdP"
driver-class-name: "oracle.jdbc.OracleDriver"

这样,我就可以访问第一个注册的数据库,但不能访问另外两个数据库。

有人有解决方案或知道如何做到这一点吗?如果我不够清楚,我会改写或添加细节。

编辑:添加了 Spring Autowiring bean 的主类:

@SpringBootApplication
@EnableAutoConfiguration
public class App {
public static void main(String[] args) {
System.out.println("My App ...");
SpringApplication.run(App.class, args);
}
}

编辑:添加实体示例:

@Entity
@Table(name = "UPSTREAM")
@IdClass(UpstreamPK.class)
public class Upstream implements Serializable {
private int numins;
private String name;

@Id
@Column(name = "NUMINS", nullable = false, precision = 0)
public int getNumins() {
return numins;
}

public void setNumins(int numins) {
this.numins = numins;
}

@Id
@Column(name = "NAME", nullable = false, length = 150)
public String getName() {
return nomfic;
}

public void setName(String name) {
this.name = name;
}
}

存储库:

@Transactional
public interface UpstreamRepository extends CrudRepository<Upstream, Long> {
}

服务:

@Service(value = "upstreamService")
public class UpstreamServiceImpl implements UpstreamService {

@PersistenceContext
private EntityManager em;

@Resource
private UpstreamRepository upstreamRepository;

@Override
public Upstream findOne(final String filename) {
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<Upstream> cq = cb.createQuery(Upstream.class);
final Root<Upstream> root = cq.from(Upstream.class);
final EntityType<Upstream> entityType = root.getModel();

cq.select(root);
Predicate where = cb.conjunction();

if (filename != null && !filename.isEmpty()) {
// Add predicate for "name"
final Predicate namePredicate = root.get(entityType.getSingularAttribute("name")).in(filename);
where = cb.and(where, namePredicate);
}

// Query creation
cq.where(where);
final TypedQuery<Upstream> q = em.createQuery(cq);

return q.getSingleResult();
}

public UpstreamRepository getUpstreamRepository() {
return upstreamRepository;
}

public void setUpstreamRepository(final UpstreamRepository upstreamRepository) {
this.upstreamRepository = upstreamRepository;
}
}

最佳答案

你现在在做什么:

您创建了 3 个数据源 bean。其中之一具有 @Primary 注释,正如 springBoot 文档所说:

如果您使用 JDBC 或 JPA 的默认自动配置(那么任何 @Autowired 注入(inject)都会选择该配置)。

这里

@PersistenceContext
private EntityManager em;

EM 使用 @Primary 上下文。

应该如何:

您应该创建 3 个自定义 EM 并为每个手动指定数据源。它们每个都具有以下属性:

 <property name="persistenceUnitName" value="name" />
<property name="dataSource" ref="dataSource" />

然后您应该将 EM 注入(inject)到您的 DAO 类中,并在 for 循环中调用每个 EM。

@PersistenceContext(unitName="name")
private EntityManager entityManager;

有用的文章: http://www.codingpedia.org/ama/how-to-setup-multiple-data-sources-with-spring-and-jpa/

通过 java spring 配置创建 EM: http://www.baeldung.com/2011/12/13/the-persistence-layer-with-spring-3-1-and-jpa/

关于java - 如何通过 Spring Boot 使用相同的实体连接 3 个数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38246006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com