{"id":155,"date":"2024-01-08T22:45:00","date_gmt":"2024-01-08T21:45:00","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=155"},"modified":"2024-01-09T21:46:50","modified_gmt":"2024-01-09T20:46:50","slug":"eine-einfuehrung-in-jpa-attribute-converter","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=155","title":{"rendered":"Eine Einf\u00fchrung in JPA Attribute Converter"},"content":{"rendered":"\n<p>Java Persistence API (JPA) ist eine weit verbreitete Java-Technologie zur Verwaltung von Datenbankzugriffen und -manipulationen in Java-Anwendungen. Eine der Herausforderungen bei der Arbeit mit JPA besteht darin, Daten aus Java-Objekten in Datenbankdaten und umgekehrt zu konvertieren, insbesondere wenn es um nicht-triviale Datentypen oder -strukturen geht. Hier kommen JPA Attribute Converter ins Spiel. In diesem Artikel werden wir ausf\u00fchrlich untersuchen, was JPA Attribute Converter sind, wie sie funktionieren und wie sie in der Praxis verwendet werden k\u00f6nnen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist ein JPA Attribute Converter?<\/h2>\n\n\n\n<p>JPA Attribute Converter ist eine Funktion von JPA 2.1 und h\u00f6her, die es erm\u00f6glicht, benutzerdefinierte Konvertierungen zwischen Java-Objekten und Datenbankwerten durchzuf\u00fchren. Mit anderen Worten, sie bieten die M\u00f6glichkeit, die Standardverhalten von JPA zu \u00fcberschreiben, wenn es darum geht, wie bestimmte Datenbankattribute in Java-Objekte und umgekehrt gemappt werden. JPA Attribute Converter sind besonders n\u00fctzlich, wenn Sie mit nicht standardm\u00e4\u00dfigen Datentypen arbeiten oder komplexe Transformationen zwischen Datenbank- und Java-Objektdaten durchf\u00fchren m\u00fcssen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die Vorteile von JPA Attribute Converter<\/h2>\n\n\n\n<p>Bevor wir in die Details eintauchen, lassen Sie uns einen Blick auf die Vorteile von JPA Attribute Converter werfen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Flexibilit\u00e4t:<\/strong> Mit JPA Attribute Converter haben Sie die volle Kontrolle \u00fcber die Datenkonvertierung. Sie k\u00f6nnen benutzerdefinierte Logik implementieren, um Daten zwischen Java-Objekten und Datenbanken zu konvertieren, was besonders n\u00fctzlich ist, wenn Sie mit nicht-trivialen Datentypen arbeiten.<\/li>\n\n\n\n<li><strong>Wiederverwendbarkeit:<\/strong> Einmal erstellte Attribute Converter k\u00f6nnen in verschiedenen Teilen Ihrer Anwendung wiederverwendet werden, um \u00e4hnliche Konvertierungen durchzuf\u00fchren, ohne denselben Code mehrmals schreiben zu m\u00fcssen.<\/li>\n\n\n\n<li><strong>Klarheit und Lesbarkeit:<\/strong> JPA Attribute Converter erm\u00f6glichen es, die Konvertierungslogik an einer zentralen Stelle zu organisieren, was die Lesbarkeit des Codes verbessert und die Wartbarkeit erh\u00f6ht.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Wie funktionieren JPA Attribute Converter?<\/h2>\n\n\n\n<p>Um JPA Attribute Converter zu verwenden, m\u00fcssen Sie zwei Hauptkomponenten implementieren:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Die Konverterklasse:<\/strong> Eine Java-Klasse, die die <code>AttributeConverter<\/code>-Schnittstelle implementiert. Diese Schnittstelle erfordert die Implementierung zweier Methoden: <code>convertToDatabaseColumn<\/code> und <code>convertToEntityAttribute<\/code>. Die erste Methode konvertiert den Wert von Java in den Datenbankwert, w\u00e4hrend die zweite Methode die Umkehrung durchf\u00fchrt.<\/li>\n\n\n\n<li><strong>Die Annotation:<\/strong> Sie verwenden die <code>@Converter<\/code>-Annotation, um den JPA-Provider dar\u00fcber zu informieren, welcher Konverter f\u00fcr ein bestimmtes Attribut verwendet werden soll. Sie k\u00f6nnen dies direkt auf dem Attribut in Ihrer Entity-Klasse oder auf der Getter-Methode anwenden.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Ein einfaches Beispiel<\/h3>\n\n\n\n<p>Um die Verwendung von JPA Attribute Converter zu verdeutlichen, betrachten wir ein einfaches Beispiel. Angenommen, wir haben eine Entity-Klasse <code>Person<\/code>, die ein Geburtsdatum als <code>LocalDate<\/code>-Objekt speichert:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Entity\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span> <\/span>{\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    <span class=\"hljs-keyword\">private<\/span> Long id;\n    <span class=\"hljs-keyword\">private<\/span> String name;\n    @Convert(converter = LocalDateConverter<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>)\n    <span class=\"hljs-title\">private<\/span> <span class=\"hljs-title\">LocalDate<\/span> <span class=\"hljs-title\">birthDate<\/span>;\n\n    \/\/ <span class=\"hljs-title\">Getter<\/span> <span class=\"hljs-title\">und<\/span> <span class=\"hljs-title\">Setter<\/span>\n}<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel verwenden wir die <code>@Convert<\/code>-Annotation, um den <code>LocalDateConverter<\/code> als Konverter f\u00fcr das <code>birthDate<\/code>-Attribut festzulegen. Jetzt m\u00fcssen wir den <code>LocalDateConverter<\/code> erstellen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Converter\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">LocalDateConverter<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">AttributeConverter<\/span>&lt;<span class=\"hljs-title\">LocalDate<\/span>, <span class=\"hljs-title\">Date<\/span>&gt; <\/span>{\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> Date convertToDatabaseColumn(LocalDate attribute) {\n        <span class=\"hljs-keyword\">return<\/span> (attribute == <span class=\"hljs-keyword\">null<\/span>) ? <span class=\"hljs-keyword\">null<\/span> : Date.valueOf(attribute);\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> LocalDate convertToEntityAttribute(Date dbData) {\n        <span class=\"hljs-keyword\">return<\/span> (dbData == <span class=\"hljs-keyword\">null<\/span>) ? <span class=\"hljs-keyword\">null<\/span> : dbData.toLocalDate();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Konverter konvertieren wir <code>LocalDate<\/code>-Objekte in <code>Date<\/code>-Objekte f\u00fcr die Datenbank und umgekehrt. Beachten Sie, dass wir die <code>@Converter<\/code>-Annotation verwenden, um den Konverter zu kennzeichnen.<\/p>\n\n\n\n<p>Jetzt k\u00f6nnen wir die <code>Person<\/code>-Entity verwenden und JPA wird automatisch die Konvertierungslogik des <code>LocalDateConverter<\/code> verwenden, um Daten zwischen der Datenbank und Java zu konvertieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Praktische Anwendungen von JPA Attribute Converter<\/h2>\n\n\n\n<p>Lassen Sie uns einige praktische Anwendungsbeispiele f\u00fcr JPA Attribute Converter betrachten:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Benutzerdefinierte Enum-Konvertierung<\/h3>\n\n\n\n<p>Angenommen, Sie haben eine Entity-Klasse, die einen Enum-Typ speichert, und Sie m\u00f6chten, dass dieser Enum-Typ in der Datenbank als Zeichenfolge (String) gespeichert wird. Sie k\u00f6nnen einen Attribute Converter verwenden, um dies zu erreichen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Converter\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RoleConverter<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">AttributeConverter<\/span>&lt;<span class=\"hljs-title\">Role<\/span>, <span class=\"hljs-title\">String<\/span>&gt; <\/span>{\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> String convertToDatabaseColumn(Role attribute) {\n        <span class=\"hljs-keyword\">return<\/span> (attribute == <span class=\"hljs-keyword\">null<\/span>) ? <span class=\"hljs-keyword\">null<\/span> : attribute.toString();\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> Role convertToEntityAttribute(String dbData) {\n        <span class=\"hljs-keyword\">return<\/span> (dbData == <span class=\"hljs-keyword\">null<\/span>) ? <span class=\"hljs-keyword\">null<\/span> : Role.valueOf(dbData);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2. JSON-Konvertierung<\/h3>\n\n\n\n<p>Wenn Sie komplexe JSON-Daten in Ihrer Datenbank speichern m\u00f6chten, k\u00f6nnen Sie einen JPA Attribute Converter verwenden, um die JSON-Serialisierung und Deserialisierung zu steuern. Hier ist ein einfaches Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@Converter\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JsonConverter<\/span> <span class=\"hljs-title\">implements<\/span> <span class=\"hljs-title\">AttributeConverter<\/span>&lt;<span class=\"hljs-title\">Map<\/span>&lt;<span class=\"hljs-title\">String<\/span>, <span class=\"hljs-title\">Object<\/span>&gt;, <span class=\"hljs-title\">String<\/span>&gt; <\/span>{\n    private ObjectMapper objectMapper = <span class=\"hljs-keyword\">new<\/span> ObjectMapper();\n\n    @Override\n    public <span class=\"hljs-built_in\">String<\/span> convertToDatabaseColumn(<span class=\"hljs-built_in\">Map<\/span>&lt;<span class=\"hljs-built_in\">String<\/span>, <span class=\"hljs-built_in\">Object<\/span>&gt; attribute) {\n        <span class=\"hljs-keyword\">try<\/span> {\n            <span class=\"hljs-keyword\">return<\/span> (attribute == <span class=\"hljs-literal\">null<\/span>) ? <span class=\"hljs-literal\">null<\/span> : objectMapper.writeValueAsString(attribute);\n        } <span class=\"hljs-keyword\">catch<\/span> (JsonProcessingException e) {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(<span class=\"hljs-string\">\"Failed to convert to JSON\"<\/span>, e);\n        }\n    }\n\n    @Override\n    public <span class=\"hljs-built_in\">Map<\/span>&lt;<span class=\"hljs-built_in\">String<\/span>, <span class=\"hljs-built_in\">Object<\/span>&gt; convertToEntityAttribute(<span class=\"hljs-built_in\">String<\/span> dbData) {\n        <span class=\"hljs-keyword\">try<\/span> {\n            <span class=\"hljs-keyword\">return<\/span> (dbData == <span class=\"hljs-literal\">null<\/span>) ? <span class=\"hljs-literal\">null<\/span> : objectMapper.readValue(dbData, <span class=\"hljs-keyword\">new<\/span> TypeReference&lt;<span class=\"hljs-built_in\">Map<\/span>&lt;<span class=\"hljs-built_in\">String<\/span>, <span class=\"hljs-built_in\">Object<\/span>&gt;&gt;() {});\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(<span class=\"hljs-string\">\"Failed to convert from JSON\"<\/span>, e);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel verwenden wir die Jackson-Bibliothek, um zwischen <code>Map&lt;String, Object><\/code> und JSON-Strings zu konvertieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Geometrische Datentypen<\/h3>\n\n\n\n<p>Wenn Sie in Ihrer Anwendung mit geografischen oder geometrischen Daten arbeiten, k\u00f6nnen Sie JPA Attribute Converter verwenden, um komplexe geometrische Datentypen wie <code>Point<\/code>, <code>Polygon<\/code> oder <code>LineString<\/code> in der Datenbank zu speichern und abzurufen. Sie k\u00f6nnen eine Bibliothek wie PostGIS verwenden, um diese geometrischen Konvertierungen durchzuf\u00fchren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zusammenfassung<\/h2>\n\n\n\n<p>JPA Attribute Converter sind ein m\u00e4chtiges Werkzeug in der Welt der Java Persistence API. Sie bieten Flexibilit\u00e4t, Wiederverwendbarkeit und verbesserte Lesbarkeit f\u00fcr die Datenkonvertierung zwischen Java-Objekten und Datenbanken. Durch die Implementierung der <code>AttributeConverter<\/code>-Schnittstelle und die Verwendung der <code>@Converter<\/code>-Annotation k\u00f6nnen Sie benutzerdefinierte Konvertierungen f\u00fcr nicht-triviale Datentypen erstellen. Dies erm\u00f6glicht es Ihnen, die Datenbankintegration in Ihrer Anwendung zu optimieren und komplexe Konvertierungslogik zentral zu organisieren.<\/p>\n\n\n\n<p>JPA Attribute Converter sind besonders n\u00fctzlich, wenn Sie mit benutzerdefinierten Datentypen, Enums, JSON-Daten oder anderen komplexen Strukturen arbeiten, die von den Standardkonvertierungen von JPA abweichen. Durch die Integration von JPA Attribute Converter in Ihre Anwendung k\u00f6nnen Sie die Datenbankinteraktion flexibler und leistungsf\u00e4higer gestalten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Java Persistence API (JPA) ist eine weit verbreitete Java-Technologie zur Verwaltung von Datenbankzugriffen und -manipulationen in Java-Anwendungen. Eine der Herausforderungen bei der Arbeit mit JPA besteht darin, Daten aus Java-Objekten in Datenbankdaten und umgekehrt zu konvertieren, insbesondere wenn es um nicht-triviale Datentypen oder -strukturen geht. Hier kommen JPA Attribute Converter ins Spiel. In diesem Artikel [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-155","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=155"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/155\/revisions"}],"predecessor-version":[{"id":156,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/155\/revisions\/156"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}