簡體   English   中英

Spring Boot多個數據庫不創建表

[英]Spring boot multiple database not creating tables

這是application.properties文件中數據庫的定義:第一個數據庫:

spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/police_db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=Admin
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

第二數據庫配置:

enroll.datasource.jdbc-url=jdbc:mysql://localhost:3306/enrollment_db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
enroll.datasource.username=root
enroll.datasource.password=Admin
enroll.datasource.driverClassName=com.mysql.cj.jdbc.Driver

我為兩個數據庫創建了兩個配置類,這是第一個或主數據庫的配置類:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",
        basePackages = {"com.cpm.repository"})
public class PoliceDbConfig {

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

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("dataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.cpm.model").persistenceUnit("model")
                .build();
    }


    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

這是第二個數據庫的配置類:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "barEntityManagerFactory",
        transactionManagerRef = "barTransactionManager", basePackages = {"com.enrollment.repository"})
public class EnrollmentDbConfig {

    @Bean(name = "enrollmentDatasource")
    @ConfigurationProperties(prefix = "enroll.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "barEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean barEntityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("enrollmentDatasource") DataSource dataSource) {
        return builder.dataSource(dataSource).
                packages("com.enrollment.model").
                persistenceUnit("model")
                .build();
    }

    @Bean(name = "barTransactionManager")
    public PlatformTransactionManager barTransactionManager(
            @Qualifier("barEntityManagerFactory") EntityManagerFactory barEntityManagerFactory) {
        return new JpaTransactionManager(barEntityManagerFactory);
    }
}

我遇到的主要問題是實體表沒有自動生成,我在網絡上搜索了該問題,並被告知要添加以下注釋:

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create

第一個注釋創建表,但是如果我將其刪除,僅保留第二個注釋(即我需要的表),則不會創建表。

另一個問題是我在資源文件夾中有一個sql腳本,該腳本應該在應用程序啟動時運行並填充表,但事實並非如此。

最后一個問題是,我已經使用spring安全性設置了基本身份驗證,但是在測試任何端點時我仍然會遭到未經授權,所以我想這是因為啟動應用程序時未填充users表,因此我添加了用戶通過MYSQL工作台手動操作並嘗試了端點,但是仍然會導致未授權的錯誤。

在這些問題上的任何幫助將不勝感激。 更新:這是安全配置類:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final SystemUserDetailService userDetailsService;

    @Autowired
    public SecurityConfig(SystemUserDetailService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(userDetailsService)
                .passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                //.antMatchers("/verification/**","/admin/**", "/login/**","/logout/**").authenticated()
                .antMatchers("/verification/**","/admin/**", "/login/**","/logout/**").authenticated()
                .and()
                .httpBasic()
                .realmName("Bio Connect")
                .and()
                .csrf()
                .disable();
    }
}

另外,這是我的UserDetailService類:

@Component
public class SystemUserDetailService implements UserDetailsService {

    private final SystemUserRepository repository;

    @Autowired
    public SystemUserDetailService(SystemUserRepository repository) {
        this.repository = repository;
    }

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        SystemUser user = repository.findByUsername(s);
        if(user == null) {
            throw new UsernameNotFoundException(String.format("User with the username %s doesn't exist", s));
        }

        // Create a granted authority based on user's role.
        // Can't pass null authorities to user. Hence initialize with an empty arraylist
        List<GrantedAuthority> authorities = new ArrayList<>();
        if(user.isAdmin()) {
            authorities = AuthorityUtils.createAuthorityList("ROLE_ADMIN");
        }
        // Create a UserDetails object from the data
        UserDetails userDetails = new User(user.getUsername(), user.getPassword(), authorities);

        return userDetails;
    }
}

盡管您沒有向我們展示所有相關代碼,但我想問題出在您的項目結構以及如何創建實體和存儲庫。

為了在Spring上使用兩個單獨的數據庫,我更喜歡為兩個數據庫的實體提供兩個單獨的程序包,並且對於兩個數據庫,您還需要具有單獨的Repositories

src/main/java
- com.multipledb   //Your db config classes are located here
  - firstdb
    - model  //entities of first database are located here
    - dao    //repositories of first database are located here
  - seconddb
    - model  //entities of second database are located here
    - dao    //repositories of second database are located here

我在Link.Plz下上傳了我的項目結構,請檢查一次

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM