JPA/Hibernate и MySQL: примеры настройки

Перед тем, как соединяться из Hibernate с MySQL, не забудьте создать пользователя, базу данных и предоставить пользователю права на неё:

CREATE USER 'test'@'%' IDENTIFIED BY 'test';
CREATE DATABASE test;
GRANT ALL PRIVILEGES ON test.* TO test;
FLUSH PRIVILEGES

Команды выше создают пользователя test с паролем test, создают базу данных test и, наконец, дают пользователю все права на эту базу. В условиях реального приложения разумеется следует выбрать пароль посложнее, да и права раздавать поаккуратнее.

Непосредственное соединение с MySQL

Перед тем, как использовать MySQL, необходимо добавить его JDBC драйвер в зависимости maven:

<properties>
  <mysql.version>6.0.5</mysql.version>
</properties>


<dependencies>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
  </dependency>
</dependencies>

С драйвером MySQL в classpath можно настраивать Hibernate как JPA провайдер. Напоминаю, что все настройки JPA находятся в файле META-INF/persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="ru.easyjava.data.jpa.hibernate">
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1:3306/test"/>
            <property name="hibernate.connection.username" value="test"/>
            <property name="hibernate.connection.password" value="test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
        </properties>
    </persistence-unit>
</persistence>

JDBC url у MySQL имеет следующий формат: jdbc:mysql://хост:порт/имябазы, например jdbc:mysql://127.0.0.1:3306/test. Имя пользователя и пароль передаются отдельными параметрами. Наконец, надо не забыть переключить диалект Hibernate на MySQL, что делается установкой свойства hibernate.dialect.

MySQL и пул c3p0

Однако, как мы знаем, одно соединение не очень удобно использовать в реальном приложении. Поэтому настроим пул c3p0 для совместного использования сJPA/Hibernate и MySQL.

Для этого, кроме MySQL JDBC драйвера,  надо добавить непосредственно c3p0 и библиотеку hibernate-cp30 к зависимостям maven:

<properties>
  <hibernate.version>5.2.1.Final</hibernate.version>
  <c3p0.version>0.9.5.2</c3p0.version>
</properties>


<dependencies>
  <dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>${c3p0.version}</version>
  </dependency>


  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>${hibernate.version}</version>
  </dependency>
</dependencies>

Для включения c3p0 достаточно добавить по меньшей мере один параметр c3p0 к настройкам Hibernate:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="ru.easyjava.data.jpa.hibernate">
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.connection." value="jdbc:mysql://127.0.0.1:3306/test"/>
            <property name="hibernate.connection.username" value="test"/>
            <property name="hibernate.connection.password" value="test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <property name="hibernate.c3p0.min_size" value="5"/>
        </properties>
    </persistence-unit>
</persistence>

Остальные параметры остаются такими же, как и для MySQL без c3p0.

MySQL и пул HikariCP

К сожалению, в Hibernate нет настолько высококачественной поддержки HikariCP, аналогичной c3p0. Поэтому настройка HikariCP требует чуть чуть больше работы.

В первую очередь, конечно же, надо добавить ещё и артефакт HikariCP в зависимости (не забываем про MySQL JDBC драйвер):

<properties>
  <hikaricp.version>2.4.3</hikaricp.version>
</properties>


<dependencies>
  <dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>${hikaricp.version}</version>
  </dependency>
</dependencies>

Потом необходимо изменить конфигурацию JPA/Hibernate для работы с HikariCP:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="ru.easyjava.data.jpa.hibernate">
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.connection.provider_class" value="com.zaxxer.hikari.hibernate.HikariConnectionProvider"/>
            <property name="hibernate.hikari.dataSourceClassName" value="com.mysql.cj.jdbc.MysqlDataSource"/>
            <property name="hibernate.hikari.dataSource.url" value="jdbc:mysql://127.0.0.1:3306/test"/>
            <property name="hibernate.hikari.username" value="test"/>
            <property name="hibernate.hikari.password" value="test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
        </properties>
    </persistence-unit>
</persistence>

Все настройки соединения с MySQL переименовываются и к ним добавляется два дополнительных параметра. Вначале в Hibernate настраивается использование HikariCP, затем указывается какой класс использовать для соединения с MySQL.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *