Я обнаружил, что сделал много ошибок.
Во-первых, конфигурация
Configuration
@ComponentScan("SpringAndDocker")
@EnableJpaRepositories("SpringAndDocker.repository")
public class ApplicationConfig {
@Value("${db.driver}")
private String databaseDriver;
@Value("${db.password}")
private String databasePassword;
@Value("${db.url}")
private String databaseUrl;
@Value("${db.username}")
private String databaseUsername;
@Value("${hibernate.dialect}")
private String hibernateDialect;
@Value("${hibernate.show_sql}")
private String hibernateShowSql;
private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";
@Resource
private Environment env;
@Bean
public DataSource dataSource()
{
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(databaseDriver);
dataSource.setUrl(databaseUrl);
dataSource.setUsername(databaseUsername);
dataSource.setPassword(databasePassword);
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory()
{
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
entityManagerFactoryBean.setJpaProperties(hibProperties());
return entityManagerFactoryBean;
}
private Properties hibProperties()
{
Properties properties = new Properties();
properties.put("hibernate.dialect", hibernateDialect);
properties.put("hibernate.show_sql", hibernateShowSql);
return properties;
}
@Bean
public JpaTransactionManager transactionManager()
{
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
}
Во-вторых docker -compose.yaml
db:
image: library/postgres:alpine
restart: always
hostname: spring-db
container_name: spring-db
volumes:
- /etc/localtime:/etc/localtime:ro
- ./docker/db/spring-db.sql:/docker-entrypoint-initdb.d/spring-db.sql:ro
- ./docker/db/spring-db.sql:/opt/db/spring-db.sql
environment:
- MYSQL_ROOT_PASSWORD=none
- MYSQL_DATABASE=spring-db
networks:
- spring
Имя хоста выше - spring-db. Но согласно application.properties
# Database related properties
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:5432/spring-db
db.username=mysql
db.password=none
# Hibernate related properties
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.show_sql=false
entitymanager.packages.to.scan=pl.insudi.model
spring.main.allow-bean-definition-overriding=true
я пытался подключиться к localhost вместо spring-db.
Это было причиной - мне следовало использовать то же имя хоста, что и в docker -compose.
Также для правильного подключения Hibernate мне нужно было использовать
db.url=jdbc:mysql://insudi-db:3306/insudi-db?allowPublicKeyRetrieval=true&useSSL=false