{"id":253,"date":"2023-10-31T14:00:11","date_gmt":"2023-10-31T13:00:11","guid":{"rendered":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/?p=253"},"modified":"2023-10-31T14:00:45","modified_gmt":"2023-10-31T13:00:45","slug":"json-mit-jpa-und-eclipselink","status":"publish","type":"post","link":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/?p=253","title":{"rendered":"JSON mit JPA und Eclipselink"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Um JSON mit JPA und dem Provider Eclipselink zu verwenden, sind folgende Schritte notwendig<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Erstellen eines Konverters<\/li>\n\n\n\n<li>Annotation der Attribute der Entit\u00e4t<\/li>\n\n\n\n<li>Annotation @Mutable von Eclipselink verwenden<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beispiel wollen wir eine Liste vom Typ <code>AbstrachItem <\/code>serialisieren und deserialisierten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Erstellen eines Konverters<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der Konverter sagt JPA, wie mit den Daten umzugehen ist. In diesem Fall soll JSON marshall \/ unmarshall aufgerufen werden. In dem vereinfachten Code sorgt ein <code>JacksonHelper <\/code>daf\u00fcr, dass mit dem ObjectMapper die Operationen durchgef\u00fchrt werden.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Converter(autoApply = true)\npublic class JsonItemActionListConverter implements AttributeConverter, String> {\n...\n@Override\npublic String convertToDatabaseColumn(List&lt;AbstractItem> value) {\n    return JacksonHelper.marshallListToJSON(new \n}\n\n\/**\n * Konvertiert einen (aus der DB gelesenen) String in eine Liste von Aktionen\n * @param value (json-)String der die Liste repr\u00e4sentiert\n * @return (mindestens leere) Liste der Aktionen\n *\/\n@Override\npublic List&lt;AbstractItemAction> convertToEntityAttribute(String value) {\n    return JacksonHelper.unmarshallListFromJSON(value, AbstractItemAction.class);\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Annotation der Attribute der Entit\u00e4t<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der Konverter wird nun in der Entit\u00e4t verwendet.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/** Liste der auszuf\u00fchrenden Aktionen *\/\n@Column(name = \"actions_as_json\", nullable = true, columnDefinition = \"json\")\n@Convert(converter = JsonItemActionListConverter.class)\nprivate List&lt;AbstractItemAction> actionsAsJson = new ArrayList&lt;>();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn ihr nun versucht, Daten zu speichern, funktioniert dies initial. Eine Aktualisierung der Werte ist allerdings nicht m\u00f6glich. Dies liegt daran, dass Eclipselink den Wert wegen des Konverters nicht als &#8222;mutable&#8220; einstuft. Um dies zu \u00e4ndern, muss eine entsprechende Annotation erg\u00e4nzt werden (es gibt auch noch andere M\u00f6glichkeiten).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/** Liste der auszuf\u00fchrenden Aktionen *\/\n@Column(name = \"actions_as_json\", nullable = true, columnDefinition = \"json\")\n@Convert(converter = JsonItemActionListConverter.class)\n@Mutable\nprivate List&lt;AbstractItemAction&gt; actionsAsJson = new ArrayList&lt;&gt;();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So definiert wird das gewollte erreicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Siehe auch: https:\/\/eclipse.dev\/eclipselink\/documentation\/2.4\/concepts\/app_dev005.htm#CCHBBHDH<br><br><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um JSON mit JPA und dem Provider Eclipselink zu verwenden, sind folgende Schritte notwendig In diesem Beispiel wollen wir eine Liste vom Typ AbstrachItem serialisieren und deserialisierten. Erstellen eines Konverters Der Konverter sagt JPA, wie mit den Daten umzugehen ist. In diesem Fall soll JSON marshall \/ unmarshall aufgerufen werden. In dem vereinfachten Code sorgt [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,7],"tags":[],"class_list":["post-253","post","type-post","status-publish","format-standard","hentry","category-jee","category-wildfly"],"_links":{"self":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts\/253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=253"}],"version-history":[{"count":2,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts\/253\/revisions"}],"predecessor-version":[{"id":255,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts\/253\/revisions\/255"}],"wp:attachment":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}