繁体   English   中英

不同方案的两个实体之间的关系 - Spring Boot Data JPA

[英]Relationship between two entities of different schemes - Spring Boot Data JPA

是否可以使用 JPA 在 Spring 引导中交叉连接两个不同的数据库表(2 个数据源)? 如果是这样,您将如何配置此配置? 在 application.properties 中,已经定义了 4 个数据库,并创建了 4 个表示数据源配置的文件。 场景是有一个 DataSource 1 表,它有一个 FOREIGN KEY 和一个 DataSource 2 表,但是当应用程序被引发时,会生成一个异常:

@OneToOne or @ManyToOne on com.smart4.bdcentral.domain.files.IndividuoFoto .persons references an unknown entity: com.smart4.bdcentral.domain.main.IndividuoPessoa

数据源 1

    package com.smart4.configBases;

import java.util.HashMap;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import com.google.common.base.Preconditions;

@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(basePackages             = {"com.smart4.bdcentral.repository.main"}, 
                       entityManagerFactoryRef  = "bdCentralMainEntityManager", 
                       transactionManagerRef    = "bdCentralMainTransactionManager")
public class BdCentralMain {

    @Autowired
    private Environment env;

    public BdCentralMain() {
        super();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean bdCentralMainEntityManager() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(bdCentralMainDataSource());
        em.setPackagesToScan(new String[] { "com.smart4.bdcentral.domain.main" });
        em.setPersistenceUnitName("bdcentralmain");

        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.MYSQL);
        vendorAdapter.setShowSql(false);
        vendorAdapter.setGenerateDdl(true);
        vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");

        em.setJpaVendorAdapter(vendorAdapter);
        final HashMap<String, Object> properties = new HashMap<String, Object>();

        properties.put("hibernate.hbm2ddl.auto", env.getProperty("bdcentralmain.hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect", env.getProperty("bdcentralmain.hibernate.dialect"));

        em.setJpaPropertyMap(properties);

        return em;
    }

    @Bean
    public DataSource bdCentralMainDataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource
                .setDriverClassName(Preconditions.checkNotNull(env.getProperty("bdcentralmain.jdbc.driverClassName")));
        dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("bdcentralmain.jdbc.url")));
        dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("bdcentralmain.jdbc.user")));
        dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("bdcentralmain.jdbc.pass")));

        return dataSource;
    }

    @Bean
    public PlatformTransactionManager bdCentralMainTransactionManager() {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(bdCentralMainEntityManager().getObject());
        return transactionManager;
    }

}

数据源 2

package com.smart4.configBases;

import java.util.HashMap;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import com.google.common.base.Preconditions;

@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(basePackages             = {"com.smart4.bdcentral.repository.files"}, 
                       entityManagerFactoryRef  = "bdCentralFilesEntityManager", 
                       transactionManagerRef    = "bdCentralFilesTransactionManager")
public class BdCentralFiles {
    
    @Autowired
    private Environment env;

    public BdCentralFiles() {
        super();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean bdCentralFilesEntityManager() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(bdCentralFilesDataSource());
        em.setPackagesToScan(new String[] { "com.smart4.bdcentral.domain.files" });
        em.setPersistenceUnitName("bdcentralfiles");

        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.MYSQL);
        vendorAdapter.setShowSql(false);
        vendorAdapter.setGenerateDdl(true);
        vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");
        em.setJpaVendorAdapter(vendorAdapter);

        final HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("bdcentralfiles.hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect", env.getProperty("bdcentralfiles.hibernate.dialect"));

        em.setJpaPropertyMap(properties);

        return em;
    }

    @Bean
    public DataSource bdCentralFilesDataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource
                .setDriverClassName(Preconditions.checkNotNull(env.getProperty("bdcentralfiles.jdbc.driverClassName")));
        dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("bdcentralfiles.jdbc.url")));
        dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("bdcentralfiles.jdbc.user")));
        dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("bdcentralfiles.jdbc.pass")));

        return dataSource;
    }

    @Bean
    public PlatformTransactionManager bdCentralFilesTransactionManager() {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(bdCentralFilesEntityManager().getObject());
        return transactionManager;
    }

}

仅对数据源没什么好说的,检查注释配置并确保您的对象是@Entity 注释的。 It doesn't sound like you actually want a "cross join", also you're looking at Hibernate, I kept reading Spring Boot JPA as spring "Data" JPA and was getting confused as to why it wasn't data jpa lol.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM