hibernate.hbm2ddl.auto - как использовать совместно с MySQL

 
 
 
Сообщения:67
"При разработке приложений автозапуска с применением библиотеки Hibernate, зачастую наблюдается стремление написать сначала классы-сущностей, а затем сформировать таблицы базы данных, исходя из их содержимого.
И это делается с помощью свойства hibernate.hbm2ddl.auto из библиотеки Hibernate.
Когда приложение запускается на выполнение в первый раз, в данном свойстве устанавливается значение create. В итоге библиотека Hibernate просмотрит все сущности, сформирует таблицы и (первичные, внешние, однозначные) ключи по отношениям, определенным с помощью аннотаций JPA и Hibernate.

Если сущности сконфигурированы правильно и в базе данных находятся предполагаемые объекты, то в упомянутом выше свойстве следует установить значение update. Тем самым библиотеке Hibernate предписывается обновить существующую
базу данных, внеся в дальнейшем любые изменения в сущности и в то же время сохранив исходную базу данных и любую введенную в нее информацию.
"

Это справедливо для H2, которая может быть настроена для распаковки в оперативную память ?

Или же можно настроить таким образом работу с MySQL , если да то как ?

Например, если используем MySQL .

У меня настроен jdbc.properties, который я использую для определения настроек для работы с MySQL8.

Сконфигурирован java-config в Spring

import org.apache.commons.dbcp2.BasicDataSource;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import javax.validation.constraints.NotEmpty;
import java.io.IOException;
import java.util.Properties;

/**
 * @PropertySource( value = {"classpath:jdbc/jdbc.properties"}  ) -
 * Указывает путь к конфигурационному файлу, содержащему данные о
 * подлкючении к базе данных.
 *  Данные этого файла будут автоматически прочитаны и переданы
 *  в объект типа Environment env;
 */

@Configuration
@ComponentScan( basePackages = "com.hibernate.spring" )
@PropertySource( value = {"classpath:jdbc/jdbc.properties"}  )
@EnableTransactionManagement
public class AppConfig {

    private static Logger logger = LoggerFactory.getLogger(AppConfig.class);

    /*объект, который работает со средой окружения текущего приложения.
    * через этот объект, можно получить доступ к файлу типа *.properties*/
    private final Environment env;

    @Autowired
    public AppConfig(Environment env) {
        this.env = env;
    }

    /*Конфигурируем dataSource - пул подключений,
    * для этого используем класс от Spring*/
    @Bean
    public DataSource dataSource() {

      //  DriverManagerDataSource dataSource = new DriverManagerDataSource();

        BasicDataSource dataSource = new BasicDataSource();

        @NotEmpty
        String propertyDriverMySql = env.getProperty("jdbc.driverClassName.MySql");

        @NotEmpty
        String propertyUrl = env.getProperty("jdbc.url");

        @NotEmpty
        String propertyUserName = env.getProperty("jdbc.username");

        @NotEmpty
        String propertyPassword = env.getProperty("jdbc.password");

        dataSource.setDriverClassName(propertyDriverMySql);
        dataSource.setUrl(propertyUrl);
        dataSource.setUsername(propertyUserName);
        dataSource.setPassword(propertyPassword);

        dataSource.setMaxConnLifetimeMillis(10);
        dataSource.setMaxIdle(5);
        dataSource.setInitialSize(5);
        dataSource.setValidationQuery("SELECT 1");

        return dataSource;

    }


    @Bean
    public SessionFactory sessionFactory() throws IOException {

        LocalSessionFactoryBean sessionFactoryBean =
                new LocalSessionFactoryBean();

        sessionFactoryBean.setDataSource( dataSource() );

        sessionFactoryBean.setPackagesToScan(
                "com.hibernate.spring.domain", "com.hibernate.spring.config");

        sessionFactoryBean.setHibernateProperties(hibernateProperties());
        sessionFactoryBean.afterPropertiesSet();

        SessionFactory sessionFactory = sessionFactoryBean.getObject();

        return sessionFactory;
    }

    private Properties hibernateProperties() {
        Properties hibernateProp = new Properties();

        hibernateProp.put("hibernate.dialect","org.hibernate.dialect.MySQL8Dialect");
        hibernateProp.put("hibernate.format_sql", true);
        hibernateProp.put("hibernate.use_sql_comments", true);
        hibernateProp.put("hibernate.show_sql", true);
        hibernateProp.put("hibernate.max_fetch_depth", 3);
        hibernateProp.put("hibernate.jdbc.batch_size", 10);
        hibernateProp.put("hibernate.jdbc.fetch_size", 50);

        return hibernateProp;
    }


    @Bean
   public PlatformTransactionManager transactionManager() throws IOException {
       HibernateTransactionManager transactionManager =
               new HibernateTransactionManager(sessionFactory());

       return transactionManager;
   }

}


Если я буду использовать hibernate.hbm2ddl.auto, где его настравивать :
- в файле jdbc.properties ?
- в java-config ? (где именно?)

При использовании
hibernate.hbm2ddl.auto = create 


таблицы для MySQl будут созданы в оперативной памяти, и тогда если все отработает, я смогу переключить , свойство в update ?

hibernate.hbm2ddl.auto = update


Произойдет физическое обновление базы данных MySQL ?

А где будет храниться старая исходная база данных, под каким именем ?

Может кто пояснить об всем этом ?
Изменен:05 апр 2019 07:33
 
 
Сообщения:9894
В настоящих проектах hbm2ddl=auto не используют - он нужен лишь чтоб поиграться, чтоб начать работать с Hibernate. В реальной жизни на него нельзя полагаться, потому как он очень ограничен - к примеру, он не умеет удалять старые колонки.

Поэтому такие скрипты оформляют в виде миграций спец инструментами типа Flyway, Liquibase.

Quote:
таблицы для MySQl будут созданы в оперативной памяти, и тогда если все отработает, я смогу переключить , свойство в update ?
update если что тоже создает таблицы.
Изменен:05 апр 2019 07:52
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет