Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何在spring引导实体中动态更改模式?_Hibernate_Spring Mvc_Spring Boot - Fatal编程技术网

Hibernate 如何在spring引导实体中动态更改模式?

Hibernate 如何在spring引导实体中动态更改模式?,hibernate,spring-mvc,spring-boot,Hibernate,Spring Mvc,Spring Boot,我使用的是spring boot(1.5.9版本)和MySQL,hibernate。在MySQL中,我有两个或更多不同的模式,schema1中有Table1,schema2中有Table2。在我的spring boot应用程序中。属性我连接了MySQL schema1数据库,我需要将schema2.Table2中的值存储在同一端口(3356)。如何在实体中动态更改架构 应用程序属性 spring.datasource.url=jdbc:mysql://localhost:3356/schema1

我使用的是spring boot(1.5.9版本)和MySQL,hibernate。在MySQL中,我有两个或更多不同的
模式,schema1中有Table1,schema2中有Table2。在我的spring boot应用程序中。属性我连接了MySQL schema1数据库,我需要将schema2.Table2中的值存储在同一端口(3356)。如何在实体中动态更改架构

应用程序属性

spring.datasource.url=jdbc:mysql://localhost:3356/schema1
spring.datasource.username=root
spring.datasource.password=12345
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
实体:

@Entity
@Table(name = "table2", schema = "schema2")
public class Company implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "CompanyID")
    private Integer id;

    @Column(name = "CompanyName")
    private String companyname;
}
错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'schema1.table2' doesn't exist
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_151]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_151]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_151]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_151]
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2487) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998) ~[mysql-connector-java-5.1.44.jar:5.1.44]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_151]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_151]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_151]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_151]
    at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) ~[tomcat-jdbc-8.5.23.jar:na]
    at com.sun.proxy.$Proxy106.executeUpdate(Unknown Source) ~[na:na]

您需要定义两种不同的配置:

spring.schema1.datasource.url=jdbc:mysql://localhost:3356/schema1
spring.schema1.datasource.username=root
spring.schema1.datasource.password=12345
spring.schema1.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.schema2.datasource.url=jdbc:mysql://localhost:3356/schema2
spring.schema2.datasource.username=root
spring.schema2.datasource.password=12345
spring.schema2.datasource.driver-class-name=com.mysql.jdbc.Driver
然后,您需要为每个数据源进行配置:

package yorPackage;

import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.sql.DataSource;

import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@EnableAutoConfiguration
@EntityScan(basePackages = "yorPackage.entity")
@EnableJpaRepositories(transactionManagerRef = "schema1TransactionManager", entityManagerFactoryRef = "schema1EntityManagerFactory", basePackages = "yorPackage.dao")
public class Schema1DbConfig {

    @Bean(name = "schema1DataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.schema1.datasource")
    public DataSource schema1DataSource() {
        return DataSourceBuilder.create().build();
    }

    @PersistenceContext(unitName = "schema1")
    @Bean(name = "schema1EntityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean schema1EntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setDataSource(schema1DataSource());
        emf.setPersistenceUnitName("schema1");
        emf.setPersistenceProvider(new HibernatePersistenceProvider());
        emf.setPackagesToScan("yorPackage");
        return emf;
    }

    @Bean(name = "schema1TransactionManager")
    @Primary
    public JpaTransactionManager schema1TransactionManager(@Qualifier("schema1EntityManagerFactory") final EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
     }
}

我已经理解了我们上面给出的内容,我想知道我是否可以在一个包中配置多个模式,这可能吗@亚历杭德罗我认为你不能。因为您需要为每个模式创建2个不同的配置。也许您可以尝试在没有模式的情况下创建连接,但我不知道这是否可行