From df82036e443716300996e7131251dcf9e9e2b8cd Mon Sep 17 00:00:00 2001 From: Gerrit Meier Date: Wed, 25 Oct 2023 18:12:04 +0200 Subject: [PATCH] Hibernate 6. --- .../2023/2023-10-25-update-november-talk.md | 14 +++++++++ _posts/2023/2023-11-16-hibernate6.md | 28 +++++++++++++++++ _posts/2023/2023-11-16-project-loom.md | 29 ------------------ assets/articles/2023/thorbenJ.jpg | Bin 0 -> 19175 bytes 4 files changed, 42 insertions(+), 29 deletions(-) create mode 100644 _posts/2023/2023-10-25-update-november-talk.md create mode 100644 _posts/2023/2023-11-16-hibernate6.md delete mode 100644 _posts/2023/2023-11-16-project-loom.md create mode 100644 assets/articles/2023/thorbenJ.jpg diff --git a/_posts/2023/2023-10-25-update-november-talk.md b/_posts/2023/2023-10-25-update-november-talk.md new file mode 100644 index 0000000..281a272 --- /dev/null +++ b/_posts/2023/2023-10-25-update-november-talk.md @@ -0,0 +1,14 @@ +--- +layout: post +title: "Hinweis Vortrag Project Loom November 2023 " +date: 2023-10-25 +categories: article +author: gerrit +--- + +Wir müssen leider den Vortrag von Michael Hunger über Project Loom in das nächste Jahr verschieben. +Dafür war aber Thorben Janssen so lieb und wird mit einem Vortrag "Tips 'n' Tricks für Hibernate 6" einspringen. +Falls Ihr Euch schon angemeldet habt und weiterhin kommen wollt, müsstet Ihr das bitte erneut unter dem neuen [**Anmeldelink**](https://www.eventbrite.de/e/tips-n-tricks-fur-hibernate-6-schnelle-losungen-fur-typische-probleme-tickets-745511132867?aff=oddtdtcreator) tun. Ansonsten wissen wir nicht, ob die alten Anmeldungen noch gewünscht sind oder nicht. + +Danke, +Gerrit \ No newline at end of file diff --git a/_posts/2023/2023-11-16-hibernate6.md b/_posts/2023/2023-11-16-hibernate6.md new file mode 100644 index 0000000..6715e42 --- /dev/null +++ b/_posts/2023/2023-11-16-hibernate6.md @@ -0,0 +1,28 @@ +--- +layout: post +title: "Tips 'n' Tricks für Hibernate 6 - schnelle Lösungen für typische Probleme und Anwendungsfälle" +location: novobit +speaker: "Thorben Janssen" +date: 2023-11-16 19:00 +categories: event +organizer: JUG +author: gerrit +image: "/assets/articles/2023/thorbenJ.jpg" +--- +Dein Kunde fordert mal wieder “nur eine kleine Änderung” in der Aufbereitung der Daten. Aber nach ein paar Stunden - oder auch Tagen - stellst du fest, dass sich das nicht so leicht im Code umsetzen lässt. + +Hättest du doch besser den Datenbankzugriff angepasst? Und überhaupt, das hat doch bestimmt schon mal jemand gemacht... + +Die gute Nachricht ist, in vielen Fällen gibt es wirklich schon ein Hibernate Feature, das dir den Großteil der Arbeit abnimmt. Eine Annotation oder wenige Zeilen Code reichen bereits aus um: +- Multi-Tenancy zu implementieren, +- Datenbank-spezifische Datentypen zu unterstützen, +- Die Elemente einer Assoziation in einer vorgegebenen Reihenfolge zu lesen, +- Daten auf Java Records abzubilden, +- UUIDs zu generieren und als Primärschlüssel zu verwenden, +- Änderungen in einem Auditlog zu dokumentieren +- und vieles mehr. + +**Anmeldung:** + +[**Eventbrite**](https://www.eventbrite.de/e/tips-n-tricks-fur-hibernate-6-schnelle-losungen-fur-typische-probleme-tickets-745511132867?aff=oddtdtcreator) + diff --git a/_posts/2023/2023-11-16-project-loom.md b/_posts/2023/2023-11-16-project-loom.md deleted file mode 100644 index bf264f4..0000000 --- a/_posts/2023/2023-11-16-project-loom.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: post -title: "Project Loom: Virtual Threads, Structured Concurrency, Scoped Values" -location: novobit -speaker: "Michael Hunger" -date: 2023-11-16 19:00 -categories: event -organizer: JUG -author: gerrit -image: "/assets/articles/2023/michaelH.jpg" ---- -Für die Nebenläufigkeit in Java gibt es zwei Optionen: - -einfacher, synchroner, blockierender Code mit begrenzter Skalierbarkeit, der gut linear zur Laufzeit nachzuvollziehen ist, oder -komplexe, asynchrone Bibliotheken mit hoher Skalierbarkeit, die schwieriger zu handhaben sind. -Projekt Loom möchte die besten Aspekte dieser beiden Ansätze zusammenbringen und Entwicklerinnen und Entwicklern zur Verfügung stellen. - -Michael geht kurz auf die Geschichte und Herausforderungen von Nebenläufigkeit in Java ein, bevor der Vortrag in die Ansätze von Loom eintaucht und etwas hinter die Kulissen der Implementierung schaut. Um so viele Threads vernünftig zu managen, braucht es etwas Struktur. Dafür gibt es Vorschläge für "Structured Concurrency", die der Vortrag ebenfalls betrachtet. - -Einige Beispiele und Vergleiche zum Test von Loom runden den Vortrag ab. - -Project Loom ist in Java 21 als öffentliches Feature enthalten, somit kann jeder testen, wie gut es mit unseren Anwendungen und Bibliotheken funktioniert. - -Spoiler: Ziemlich gut. - -**Anmeldung:** - -[**Eventbrite**](https://www.eventbrite.de/e/project-loom-virtual-threads-structured-concurrency-scoped-values-tickets-737830469797?aff=oddtdtcreator) - diff --git a/assets/articles/2023/thorbenJ.jpg b/assets/articles/2023/thorbenJ.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b7ec12eeba9505f56d7d22a19390b74329c03a0 GIT binary patch literal 19175 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 A5C8xG literal 0 HcmV?d00001