Статьи

Учебное пособие по JPA: Настройка сохраняемой конфигурации для среды Java SE

В моей  предыдущей статье я написал пример, показывающий, как настроить JPA для его запуска в среде Java SE. Я также показал пример файла persistence.xml, который выглядит ниже:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence

http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"

  version="2.1">

  <persistence-unit name="jpa-example" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <properties>
      <!-- Configuring JDBC properties -->
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/jpa_example" />
      <property name="javax.persistence.jdbc.user" value="root" />
      <property name="javax.persistence.jdbc.password" value="my_root_password" />
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />

      <!-- Hibernate properties -->
      <property name="hibernate.show_sql" value="true" />
      <property name="hibernate.format_sql" value="true" />
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
      <property name="hibernate.hbm2ddl.auto" value="validate" />

      <!-- Configuring Connection Pool -->
      <property name="hibernate.c3p0.min_size" value="5" />
      <property name="hibernate.c3p0.max_size" value="20" />
      <property name="hibernate.c3p0.timeout" value="500" />
      <property name="hibernate.c3p0.max_statements" value="50" />
      <property name="hibernate.c3p0.idle_test_period" value="2000" />
    </properties>
  </persistence-unit>
</persistence>

Тем, кто только начинает работать с JPA, позвольте мне объяснить некоторые компоненты этой конфигурации.

Первый раздел используется для настройки соединения JDBC, которое будет использоваться поставщиком сохраняемости. Обычно в этом разделе мы указываем URL JDBC, имя пользователя базы данных, пароль и полное имя класса Driver. Во втором разделе настраиваются некоторые значения свойств для режима гибернации, и поясняется ниже —

  1. Свойство «hibernate.show_sql» указывает, будет ли hibernate печатать запросы в файле журнала (при условии, что вы правильно настроили log4j). Это особенно полезно, если вы хотите посмотреть, какие запросы выполняются для чтения / записи / удаления некоторых объектов. В производственной среде вы можете установить значение false, если хотите, чтобы запросы не регистрировались.
  2. Свойство «hibernate.format_sql» указывает, будут ли запросы отформатированы в более читаемую форму перед регистрацией.
  3. Свойство «hibernate.dialet» указывает, какой тип диалектов мы намерены использовать. Если вы не знаете, что они из себя представляют, прочитайте  этот отличный ответ  на StackOverflow.
  4. Свойство «hibernate.hbm2ddl.auto» очень интересное. Изменяя его значение, вы можете включить hibernate для создания / удаления ваших таблиц базы данных или проверки существующей схемы в соответствии с вашим отображением. Это также было  очень хорошо объяснено  в StackOverflow.

В последнем разделе настраивается пул соединений, который Hibernate будет использовать для базы данных. Обычно Hibernate предоставляет встроенный механизм пула соединений, который достаточно хорош для разработки и тестирования, но не подходит для производственной среды. Таким образом, чтобы получить оптимальное поведение пула соединений в производственной среде, вам нужно использовать что-то более зрелое.  C3P0  — это популярная библиотека пула соединений промышленного уровня, которую очень легко использовать с Hibernate. Все, что вам нужно сделать, это просто указать значения свойств, такие как минимальное / максимальное количество соединений в пуле, значения времени ожидания и т. Д., А остальное позаботится о Hibernate.

Есть еще один важный момент, который я пропустил в прошлой статье. Для того чтобы объекты были найдены поставщиком постоянства в среде Java SE, они должны быть перечислены в файле persistence.xml следующим образом:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence

http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"

  version="2.1">

  <class>fully.qualified.path.of.the.entity</class>

  <!-- rest of the contents -->

  </persistence-unit>
</persistence>

Это гарантирует, что поставщик сущностей найдет ваши сущности и будет готов к сохранению. Однако hibernate автоматически сканирует пакеты для классов, помеченных аннотацией «Entity», и делает их постоянными, поэтому нам не пришлось об этом беспокоиться. Помните, что это также относится к случаю, когда вы используете JPA в среде Java EE (т. Е. Ваше приложение работает на полномасштабном сервере приложений). В этом случае сервер приложений сканирует приложение во время его развертывания и находит классы, помеченные как объекты. Если вы запускаете свое приложение в среде Java SE с помощью провайдера, который не имеет возможности автоматического сканирования этого типа, вам потребуется перечислить объекты в файле persistence.xml, как указано выше.

Вот и все для настройки JPA в среде Java SE. Надеемся, что после того, как вы настроите эту настройку, вы без труда сможете сохранить свои сущности.