66 lines
2.5 KiB
Markdown
66 lines
2.5 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
tags:
|
|||
|
- зрелость/🌱
|
|||
|
date:
|
|||
|
- - 2024-05-17
|
|||
|
zero-link:
|
|||
|
- "[[00 Hibernate]]"
|
|||
|
parents:
|
|||
|
linked:
|
|||
|
---
|
|||
|
Конвертеры в Hibernate позволяют изменить тип хранения в БД. Например, у нас в колонке будет храниться строка "POST, GET, PUT", а в Java мы хотим сразу получать `Set<String>`, а не строку, для этого нужно написать конвертер.
|
|||
|
|
|||
|
Создаем класс-конвертер, который будет преобразовывать строку в `Set<String>` и обратно:
|
|||
|
|
|||
|
```java
|
|||
|
import javax.persistence.AttributeConverter;
|
|||
|
import javax.persistence.Converter;
|
|||
|
import java.util.Arrays;
|
|||
|
import java.util.HashSet;
|
|||
|
import java.util.Set;
|
|||
|
import java.util.stream.Collectors;
|
|||
|
|
|||
|
@Converter
|
|||
|
public class StringSetConverter implements AttributeConverter<Set<String>, String> {
|
|||
|
|
|||
|
@Override
|
|||
|
public String convertToDatabaseColumn(Set<String> attribute) {
|
|||
|
if (attribute == null || attribute.isEmpty()) {
|
|||
|
return "";
|
|||
|
}
|
|||
|
return attribute.stream().collect(Collectors.joining(", "));
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public Set<String> convertToEntityAttribute(String dbData) {
|
|||
|
if (dbData == null || dbData.isEmpty()) {
|
|||
|
return new HashSet<>();
|
|||
|
}
|
|||
|
return Arrays.stream(dbData.split(", "))
|
|||
|
.collect(Collectors.toSet());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
Используем этот конвертер в нашей сущности:
|
|||
|
|
|||
|
```java
|
|||
|
import io.quarkus.hibernate.orm.panache.PanacheEntity;
|
|||
|
import javax.persistence.Convert;
|
|||
|
import javax.persistence.Entity;
|
|||
|
import java.util.Set;
|
|||
|
|
|||
|
@Entity
|
|||
|
public class MyEntity extends PanacheEntity {
|
|||
|
|
|||
|
@Convert(converter = StringSetConverter.class)
|
|||
|
public Set<String> methods;
|
|||
|
|
|||
|
// остальные поля и методы
|
|||
|
}
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
Можно также использовать `@Converter(autoApply = true)`, чтобы данный конвертер автоматически применялся ко всем полям соответствующего типа в любых сущностях, где это возможно. Другими словами, если у вас есть несколько сущностей с полями типа `Set<String>`, этот конвертер будет автоматически применяться ко всем этим полям без необходимости явно указывать его с помощью `@Convert`.
|