JPA – Attribute Converter

Cześć.
Częstym problemem spotkanym podczas operowania na danych bazy jest konieczność przechowywania danych w inny sposób w obiekcie encji, a inny w bazie danych.
Na rozwiązanie tego problemu jest kilka sposobów. Dzisiaj przedstawię wam metodę wprowadzona w JPA 2.1, nazywaną Attribute Converter.

Problem:

Możemy wyobrazić sobie sytuację, w której mamy jakiś obiekt posiadający np. listę wartości jako jedno pole. Nie chcemy tworzyć specjalnie do tych wartości prostych nowej tabeli oraz używać relacji. W tym miejscu możemy użyć właśnie Attribute Converter, który podczas zapisu do bazy zmieni listę na Stringa, a podczas odczytu zamieni Stringa na listę.

Implementacja:

@Converter
public class ExampleConverter implements AttributeConverter<List<String>, String> {

    @Override
    public String convertToDatabaseColumn(List<String> strings) {
        return StringUtils.join(strings, ",");
    }

    @Override
    public List<String> convertToEntityAttribute(String s) {
        return Arrays.asList(s.split("\\s*,\\s*"));
    }
}

Jak widzimy, konieczna jest implementacja interfejsu AttributeConverter, który w parametrach przyjmuje dwie wartości – typ obiektu, którego będziemy używać w entity oraz typ obiektu, którego będziemy używać w bazie danych.
Implementujemy dwie metody:
convertToDatabaseColumn() – przyjmuje obiekt z Entity i zwraca obiekt, który zapisany zostanie do bazy danych
convertToEntityAttribute() – przyjmuje obiekt z bazy danych i zwraca obiekt, który zapisany zostanie do Entity

 

Użycie:

Istnieją dwa sposoby użycia tego mechanizmu:
– w adnotacji Convert w klasie naszego konwertera wartość atrybut autoapply musi zostać ustawiona na true. W tym przypadku konwerter będzie używany dla wszystkich obiektów typu, który został tam zdefiniowany

@Converter(autoApply = true)

– dodanie adnotacji javax.persistence.Convert do atrybutu, który chcemy konwertować

    @Column(name = "values")
    @Convert(converter = ValuesConverter.class)
    private List<String> values;

Oczywiście, wielu z was zadało sobie pytanie, dlaczego w bazie danych przechowuje listę wartości jako String, skoro istnieje przecież typ wbudowany Array.
Już śpieszę z odpowiedzią. Typ Array występuję tylko w niektórych bazach danych np. PostreSQL, a po drugie konwersja na ten typ przy pomocy Attribute Converter jest trudna ze względu na specyficzną konfigurację, dlatego w następnym poście przedstawię inny sposób na przechowywanie typu Array.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *