Hibernate автосоздание базы

Андрей Курулёв

При работе с базой данных при помощи hibernate можно задавать параметр hibernate.hbm2ddl.auto, который определяет, что делать с базой (создать, обновить и т.д.). Мне нужно, чтобы база сама создавалась. У меня для этого написан следующий код:

//Сервис для работы с базой
public class DBService {
    private SessionFactory sessionFactory;

    public DBService(Configuration configuration){
        sessionFactory = createSessionFactory(configuration);
    }

    private static SessionFactory createSessionFactory(Configuration configuration){
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder();
        builder.applySettings(configuration.getProperties());
        ServiceRegistry serviceRegistry = builder.build();
        return configuration.buildSessionFactory(serviceRegistry);
    }
}

//Датасет
@Entity(name = "user")
@Table(name = "users")
public class UserDataSet implements Serializable {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "login")
    private String login;

    @Column(name = "password")
    private String password;

    @Column(name = "email")
    private String email;

    public UserDataSet(){}

    public UserDataSet(String login, String password, String email){
        this.login = login;
        this.password = password;
        this.email = email;
    }
}

Ну и дальше я где-то еще в коде задаю конфигурацию для датабазного сервиса и создаю его:

Configuration configuration = new Configuration()
    .addAnnotatedClass(UserDataSet.class)
    .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
    .setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver")
    .setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/somedb")
    .setProperty("hibernate.connection.username", "some_user")
    .setProperty("hibernate.connection.password", "some_password")
    .setProperty("hibernate.show_sql", "false")
    .setProperty("hibernate.hbm2ddl.auto", "create");

dbService = new DBService(configuration);

Вроде бы и все хорошо, все должно работать, но нет. Вылетает исключение, типа база не существует. Причем если ее создать руками, то все работает.

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'somedb'

По логике, при установке hibernate.hbm2ddl.auto в значение create, база должна создаться и все должно работать, но так не происходит. В чем может быть проблема?

2 ответа

Андрей Курулёв

Гибернейт не создает базу, он создает схему, т.е. структуру данных в существующей БД. Как вы можете видеть, вы задаете БД уже в JDBC URL, и создание базы выходит за пределы ответственности гибернейта - гибернейт оперирует уже внутри базы данных. Так или иначе, вам всегда нужно будет создавать саму БД руками.


Андрей Курулёв

Может ответ и запоздалый, но добавь в конце hibernate.connection.url вот это: ?createDatabaseIfNotExist=true.

licensed under cc by-sa 3.0 with attribution.