Настройка базы данных Spring - PullRequest
1 голос
/ 13 апреля 2020

Я столкнулся с одной проблемой, которая сводила меня с ума в ее решении. Проблема в следующем: когда я настраиваю соединение с моей базой данных в классе java - это работает хорошо, т.е. создаются таблицы в БД, соответствующие именам моих классов. НО. Когда я пытаюсь использовать файл application.properties вместо java конфигурации класса, все, что правильно именует таблицы, игнорируется, и я не понимаю, что мне делать с этой проблемой (

Например: у меня есть класс с именем как 'ATMResearcher'. Когда я использую класс java для настройки, в моей базе данных есть таблица 'ATMResearcher'. Но когда мои свойства конфигурации описаны в файле app.properties (без использования класса конфигурации), тогда появляется ' Таблица atm_researcher в БД

Надеюсь, кто-нибудь мне поможет. Я предоставляю скриншоты моего класса конфигурации и файла application.properties ниже.


application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/someDB
spring.datasource.username=name
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

spring.jpa.hibernate.ddl-auto=create

JpaConfig. java файл:

@EnableJpaRepositories(basePackages = "repositories")
@Configuration
@EnableTransactionManagement
public class JpaConfig {

    private LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan("entities");
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());
        return em;
    }

    private DataSource dataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/someDB");
        dataSource.setUsername("name");
        dataSource.setPassword("password");
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager(){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory((EntityManagerFactory) entityManagerFactory());

        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
        return new PersistenceExceptionTranslationPostProcessor();
    }

    private Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "create");
        properties.setProperty(
                "hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        return properties;
    }
}

ATMResearcher. java

@Data
@Entity(name = "ATMResearcher")
@Table(name = "ATMResearcher")
@NamedQueries({
        @NamedQuery(name = ATMResearcher.findByAtm, query = "from ATMResearcher i where i.atm=:name")})
public class ATMResearcher implements Serializable {

    private static final long serialVersionUID = 2046903428407635527L;
    public static final String findBy = "researcherAtm.findByAtm";

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String researcher;
    @ColumnDefault(value = "1")
    private float volume;
    @OneToMany(mappedBy = "atmReseacher", cascade = CascadeType.MERGE, targetEntity = ATMEval.class)
    private Set<ATMEval> atmEval;

    public String getShortName() {
        return Arrays.stream(researcher.split(" ")).filter(n -> n.length() > 2)
                .map(n -> n.substring(0, 1).toUpperCase()).collect(Collectors.joining());
    }

    @Override
    public String toString() {
        return "ATMResearcher{" +
                "id=" + id +
                ", researcher='" + discipline + '\'' +
                '}';
    }

}

Ответы [ 3 ]

0 голосов
/ 13 апреля 2020

Извините, но я не совсем понимаю, что вы имеете в виду, когда "когда я настраиваю соединение с моей базой данных в классе java - это работает хорошо".

Но при взгляде на ваш код есть что-то что вы, возможно, еще не видели. Вы используете верблюд в названии таблицы. В результате получается имя таблицы "atm_reasearch".

@Data
@Entity(name = "ATMResearcher")
@Table(name = "ATMResearcher")

Надеюсь, это решит вашу проблему.

0 голосов
/ 13 апреля 2020

Здравствуйте, вам нужно объявить стратегии именования в вашем файле application.yml или свойства. По умолчанию у Spring будет такое поведение:

  • Замените точки подчеркиванием
  • Измените регистр верблюда на случай змеи
  • имена таблиц в нижнем регистре

Вы должны использовать стандарт JPA

для JPA 1.0

spring:
  jpa:
    hibernate:
      naming:
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

для JPA 2.0

spring:
  jpa:
    hibernate:
      naming:     
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl

Для одинаковых имен используйте физическую стратегию

0 голосов
/ 13 апреля 2020

Я думаю, вам не хватает этого:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

Если это работает, ваши свойства должны выглядеть следующим образом:

spring.datasource.driverClassName=
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create

spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
...