Статьи

JPA — Hibernate — отображение типов на уровне пакета

Когда мы наконец достигли достаточной зрелости, чтобы использовать некоторые пользовательские сопоставления типов в JPA, мы обычно придерживаемся решения, ориентированного на конкретного поставщика, поскольку сам JPA не определяет какой-либо механизм для этого. Позвольте мне показать вам пример определения пользовательского сопоставления типов для одного из поставщиков JPA — Hibernate . Предположим, что мы используем Joda Money в нашем проекте и имеем объект со свойством типа Money . Уже есть довольно хорошие реализации отображения типов для Money , предоставленные проектом Jadira — User Types . Все, что нам нужно сделать, это просто сообщить Hibernate, что мы хотим использовать конкретное сопоставление типов. Когда вы посмотрите на Документы Hibernate, Раздел 5.1.4.1.1: Тип , вы увидите несколько возможностей, начиная с самого простого — использование аннотации @Type для каждого свойства, имеющего тип Money . Этот выбор может быть хорошим, если в вашем доменном отображении есть только одно или очень мало свойств этого типа. Очень вероятно, что раньше

или позже, когда ваш проект вырастет достаточно, их будет все больше и больше, и вы получите много похожих строк, определяющих одно и то же отображение типов. Если вы не большой поклонник повторения или не доверяете рефакторингу, выполненному вашими учениками, вам следует подумать о другом, используя аннотации @TypeDefs и @TypeDef . Как вы можете прочитать в документации Hibernate:

«Эти аннотации могут быть размещены на уровне класса или пакета».

Давайте сосредоточимся на втором варианте — уровне пакета. Мы разместим эти аннотации в package-info.java для наших доменных сущностей, содержащих пакет (см. Спецификация языка Java — 7.4.1. Именованные пакеты ). Это будет выглядеть так:

01
02
03
04
05
06
07
08
09
10
/**
 * Provides the domain model.
 *
 * @author Warlock
 */
@org.hibernate.annotations.TypeDef(name = "money", defaultForType = Money.class, typeClass = PersistentMoneyAmount.class)
package com.blogspot.vardlokkur.domain;
 
import org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmount;
import org.joda.money.Money;

Теперь, когда вы отображаете свойство с использованием типа Money , вы можете сделать это без дополнительной спецификации сопоставления типов, например так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.blogspot.vardlokkur.domain;
  
...
import org.joda.money.Money;
  
@Entity
@Table(name = "EMPLOYEE")
public class Employee implements Serializable {
  
...
@Column(name = "SALARY")
private Money salary;
  
...
  
}

Одна техническая заметка, прежде чем вы станете счастливым пользователем картографирования денег — поскольку PersistentMoneyAmount использует один столбец (удерживающую сумму) для картографирования денег , необходимо указать валюту, которая будет использоваться вместе с суммой. Валюта по умолчанию может быть определена как свойство единицы сохраняемости : jadira.usertype.currencyCode

PS. Не рассматривайте приведенный выше пример Money как руководство по составлению карт Joda Money, возможно, есть лучшие способы сделать это, см. Блог Jadira User Types .

Несколько ссылок на десерт:

Ссылка: JPA — Hibernate — Отображение типов на уровне пакета от нашего партнера JCG Михала Джастака в блоге Warlock’s Мысли .