Можно ли убедить JPA преобразовать, например, UUID в строки? - PullRequest
5 голосов
/ 09 декабря 2011

У меня есть объект Java с полем, которое является UUID. Я хотел бы иметь возможность сохранить этот объект в базе данных очевидным способом; тем не менее, базовое отображение будет использовать сериализацию Java для его записи, в то время как я хочу, чтобы UUID присутствовал в его очевидной строковой форме. Есть ли способ предоставить преобразователь UUID <-> String в JPA для этого поля, которое будет использоваться во время чтения и записи, чтобы я мог обрабатывать этот тип естественным образом?

Ответы [ 3 ]

5 голосов
/ 09 декабря 2011

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

В зависимости от вашего провайдера JPA вы можете использовать методы, специфичные для реализации, например, Hibernate предоставляет для этой цели тип uuid-char:

@Type(type = "uuid-char")
private UUID uuid;
4 голосов
/ 09 декабря 2011

Вы можете аннотировать ваше UUID свойство @Transient и в то же время предоставлять его постоянное строковое представление.

Во время @PrePersist, @PreUpdate или @PostLoad вы установитеСтроковое представление на основе UUID или (в случае загрузки его из БД) заново создайте UUID из String.

2 голосов
/ 19 января 2018

Крис Лерчер прокомментировал Примечание: Начиная с JPA 2.1, @Convert annotation can be used with an AttributeConverter<UUID, String>.

Этот подход хорошо работает и совместим с любым поставщиком JPA, тогда как@Type(type = "uuid-char") зависит от поставщика.Кроме того, autoApply=true применяется к каждому полю каждого объекта, поэтому нет необходимости аннотировать каждое поле в каждом объекте.См. Документацию здесь и проверьте приведенный ниже пример:

Класс преобразователя

@Converter(autoApply = true)
public class UuidConverter implements AttributeConverter<UUID, String> {

    @Override
    public String convertToDatabaseColumn(final UUID entityValue) {
        return ofNullable(entityValue)
                .map(entityUuid -> entityUuid.toString())
                .orElse(null);
    }

    @Override
    public UUID convertToEntityAttribute(final String databaseValue) {
        return ofNullable(databaseValue)
                .map(databaseUuid -> UUID.fromString(databaseUuid))
                .orElse(null);
    }
}


Сущность

@Entity
public class Customer implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column
    private String name;

    @Column(nullable = false, unique = true, updatable = false, columnDefinition="CHAR(36)")
    private UUID customerId = randomUUID();

    //.....
}


А вот так это выглядит в базе

TABLE customer
ID  BIGINT(19)  NO  PRI (NEXT VALUE FOR SYSTEM_SEQUENCE_5D3)
NAME    VARCHAR(255)    YES     NULL
CUSTOMER_ID VARCHAR(36) NO  UNI NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...