digital-garden/knowledge/dev/java/frameworks/hibernate/Конвертер типов для Hibernate.md
2024-06-13 21:01:37 +03:00

66 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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`.