Когда мы наконец достигли достаточной зрелости, чтобы использовать некоторые пользовательские сопоставления типов в 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 .