Перед тем, как соединяться из Hibernate с PostgreSQL, не забудьте создать пользователя, базу данных и предоставить пользователю права на неё:
CREATE ROLE test WITH PASSWORD 'test'; ALTER ROLE test WITH LOGIN; CREATE DATABASE test OWNER test;
Команды выше создают пользователя test с паролем test, создают базу данных test и назначают пользователя владельцем базы. В условиях реального приложения, разумеется, следует выбрать пароль посложнее.
Непосредственное соединение с PostgreSQL
Перед тем, как использовать PostgreSQL, необходимо добавить его JDBC драйвер в зависимости maven:
<properties> <postgresql.version>9.4.1212.jre7</postgresql.version> </properties> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>${postgresql.version}</version> </dependency> </dependencies>
С драйвером PostgreSQL в 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:postgresql://127.0.0.1:5432/test"/> <property name="hibernate.connection.username" value="test"/> <property name="hibernate.connection.password" value="test"/> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL94Dialect"/> </properties> </persistence-unit> </persistence>
JDBC url у PostgreSQL имеет следующий формат: jdbc:postgresql://хост:порт/имябазы, например jdbc:postgresql://127.0.0.1:5432/test. Имя пользователя и пароль передаются отдельными параметрами. Наконец, надо не забыть переключить диалект Hibernate на PostgreSQL, что делается в последней строке.
PostgreSQL и пул c3p0
Однако, как мы знаем, одно соединение не очень удобно использовать в реальном приложении. Поэтомунастроим пул c3p0 для совместного использования сJPA/Hibernate и PostgreSQL.
Для этого, кроме PostgreSQL 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.url" value="jdbc:postgresql://127.0.0.1:5432/test"/> <property name="hibernate.connection.username" value="test"/> <property name="hibernate.connection.password" value="test"/> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL94Dialect"/> <property name="hibernate.c3p0.min_size" value="5"/> </properties> </persistence-unit> </persistence>
Остальные параметры остаются такими же, как и для PostgreSQL без c3p0.
PostgreSQL и пул HikariCP
К сожалению, в Hibernate нет настолько высококачественной поддержки HikariCP, аналогичной c3p0. Поэтому настройка HikariCP требует чуть чуть больше работы.
В первую очередь, конечно же, надо добавить ещё и артефакт HikariCP в зависимости (не забываем про PostgeSQL 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="org.postgresql.ds.PGSimpleDataSource"/> <property name="hibernate.hikari.dataSource.url" value="jdbc:postgresql://127.0.0.1:5432/test"/> <property name="hibernate.hikari.username" value="test"/> <property name="hibernate.hikari.password" value="test"/> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL94Dialect"/> </properties> </persistence-unit> </persistence>
Все настройки соединения с PostgreSQL переименовываются и к ним добавляется два дополнительных параметра. Вначале в Hibernate настраивается использование HikariCP, затем указывается какой класс использовать для соединения с PostgreSQL.