Vorgegeben
Als DBMS wird MySQL verwendet
Entitäten sind: Ort, Mitglied und Sportart
Beziehungen sind: Ort → Mitglied (1: N), Mitglied ← > Sportart (N:M)
Es werden CRUD-Operationen für alle Entities eingerichtet
Es werden Abfragen mit Filterkriterien gezeigt.
Verwendete Bibliotheken: Hibernate 6.1.0, Jakarta 3.1.0, MySQL Connector 8.2.0
pom.xml
< project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd" >
...
< dependencies >
<!-- Hibernate -->
< dependency >
< groupId >org.hibernate.orm</ groupId >
< artifactId >hibernate-core</ artifactId >
< version >6.1.0.Final</ version >
</ dependency >
<!-- Jakarta Persistence API -->
< dependency >
< groupId >jakarta.persistence</ groupId >
< artifactId >jakarta.persistence-api</ artifactId >
< version >3.1.0</ version >
</ dependency >
<!-- MySQL Connector -->
< dependency >
< groupId >com.mysql</ groupId >
< artifactId >mysql-connector-j</ artifactId >
< version >8.2.0</ version >
</ dependency >
</ dependencies >
...
</ project >
Erklärung:
Hibernate ist der Kern deiner Datenbank-ORM (Object Relational Mapping) Bibliothek.
Die Jakarta Persistence API definiert die JPA-Annotationen wie @Entity, @OneToMany, @ManyToOne. Hibernate implementiert diese API.
Der JDBC -Treiber für MySQL ermöglicht, dass Java sich mit deiner MySQL-8-Datenbank verbinden kann.
/src/main/resources/hibernate.cfg.xml
<? xml version = "1.0" encoding = "UTF-8" ?>
<! DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 6.0//EN"
"https://hibernate.org/dtd/hibernate-configuration-6.0.dtd">
< hibernate-configuration >
< session-factory >
<!-- JDBC Verbindung -->
< property name = "hibernate.connection.driver_class" >
com.mysql.cj.jdbc.Driver
</ property >
< property name = "hibernate.connection.url" >
jdbc:mysql://localhost:3306/dbverein_orm?useSSL=false &
serverTimezone=UTC
</ property >
< property name = "hibernate.connection.username" >
root
</ property >
< property name = "hibernate.connection.password" >
password
</ property >
<!-- Dialekt -->
< property name = "hibernate.dialect" >
org.hibernate.dialect.MySQLDialect
</ property >
<!-- Schema automatisch erzeugen -->
< property name = "hibernate.hbm2ddl.auto" >
update
</ property >
<!-- SQL Debugging -->
< property name = "hibernate.show_sql" >
true
</ property >
< property name = "hibernate.format_sql" >
true
</ property >
<!-- Annotierte Entities -->
< mapping class = "hibernate.blogic.Ort" />
< mapping class = "hibernate.blogic.Mitglied" />
< mapping class = "hibernate.blogic.Sportart" />
</ session-factory >
</ hibernate-configuration >
Erklärungen
Die Konfiguration enthält die Datenbank-URL. Der Name der Datenbank ist dbverein_orm. Sie muss vorhanden sein.
Hibernate erzeugt oder aktualisiert die Tabellen automatisch, wenn sich die Entity-Klassen ändern. Das ist ideal für Entwickler – für die Produktion muss das geändert werden.
Die Klassen-Mappings legen fest, dass Hibernate diese Klassen als Entities behandeln soll und in Tabellen umwandet.
logback.xml
< configuration >
< logger name = "org.hibernate" level = "WARN" />
< logger name = "org.hibernate.SQL" level = "WARN" />
< logger name = "org.hibernate.type.drscriptor.sql.BasicBinder" level =
"WARN" />
< root level = "ERROR" >
< apender-ref ref = "CONSOLE" />
</ root >
</ configuration >
Entity Klassen
Ort.java
package hibernate.blogic;
import jakarta.persistence. * ;
import java.util.ArrayList;
import java.util.List;
@ Entity
public class Ort {
@ Id
@ GeneratedValue ( strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ OneToMany ( mappedBy = "ort" , cascade = CascadeType.ALL, orphanRemoval = true )
private List< Mitglied > mitglieder = new ArrayList<>();
// Getter / Setter
public Long getId () {
return id;
}
public void setId (Long id ) {
this .id = id;
}
public String getName () {
return name;
}
public void setName (String name ) {
this .name = name;
}
public List< Mitglied > getMitglieder () {
return mitglieder;
}
}
Mitglied.java
package hibernate.blogic;
import jakarta.persistence. * ;
import java.util.HashSet;
import java.util.Set;
@ Entity
public class Mitglied {
@ Id
@ GeneratedValue ( strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ ManyToOne
@ JoinColumn ( name = "ort_id" )
private Ort ort;
@ ManyToMany ( cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@ JoinTable ( name = "mitglied_sportart" , joinColumns = @ JoinColumn ( name = "mitglied_id" ), inverseJoinColumns = @ JoinColumn ( name = "sportart_id" ))
private Set< Sportart > sportarten = new HashSet<>();
// Getter / Setter
public Long getId () {
return id;
}
public void setId (Long id ) {
this .id = id;
}
public String getName () {
return name;
}
public void setName (String name ) {
this .name = name;
}
public Ort getOrt () {
return ort;
}
public void setOrt (Ort ort ) {
this .ort = ort;
}
public Set< Sportart > getSportarten () {
return sportarten;
}
}
Sportart.java
package hibernate.blogic;
import jakarta.persistence. * ;
import java.util.HashSet;
import java.util.Set;
@ Entity
public class Sportart {
@ Id
@ GeneratedValue ( strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ ManyToMany ( mappedBy = "sportarten" )
private Set< Mitglied > mitglieder = new HashSet<>();
// Getter / Setter
public Long getId () {
return id;
}
public void setId (Long id ) {
this .id = id;
}
public String getName () {
return name;
}
public void setName (String name ) {
this .name = name;
}
public Set< Mitglied > getMitglieder () {
return mitglieder;
}
}
Main
package hibernate.blogic;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class App {
public static void main ( String [] args ) {
try {
// ===================== Datenbank zurücksetzen =======
Connection cnn = DriverManager
. getConnection ( "jdbc:mysql://localhost:3306/dbverein_orm" ,
"root" , "kennwort1" );
cnn. createStatement ()
. execute ( "DROP DATABASE IF EXISTS dbverein_orm" );
cnn. createStatement (). execute ( "CREATE DATABASE dbverein_orm" );
cnn. close ();
} catch (SQLException e ) {
System.err. println (e);
}
// ===================== Hibernate =======================
SessionFactory factory = new Configuration (). configure (). buildSessionFactory ();
Session session = factory. openSession ();
try {
// ===================== INSERT =====================
session. beginTransaction ();
Ort berlin = new Ort ();
berlin. setName ( "Berlin" );
Ort hamburg = new Ort ();
hamburg. setName ( "Hamburg" );
Sportart fussball = new Sportart ();
fussball. setName ( "Fußball" );
Sportart schwimmen = new Sportart ();
schwimmen. setName ( "Schwimmen" );
Mitglied anna = new Mitglied ();
anna. setName ( "Anna" );
anna. setOrt (berlin);
anna. getSportarten (). add (fussball);
anna. getSportarten (). add (schwimmen);
Mitglied ben = new Mitglied ();
ben. setName ( "Ben" );
ben. setOrt (hamburg);
ben. getSportarten (). add (fussball);
berlin. getMitglieder (). add (anna);
hamburg. getMitglieder (). add (ben);
session. persist (berlin);
session. persist (hamburg);
session. getTransaction (). commit ();
// ===================== SELECT =====================
session. beginTransaction ();
System.out. println ( "=== Alle Mitglieder ===" );
List< Mitglied > alle = session. createQuery (
"from Mitglied" , Mitglied.class). list ();
for (Mitglied m : alle) {
System.out. println ( "Mitglied: " + m. getName ());
System.out. println ( "Wohnort: " + m. getOrt (). getName ());
System.out. println ( "Sportarten: " );
for (Sportart s : m. getSportarten ()) {
System.out. print ( " \n " + s. getName ());
}
}
session. getTransaction (). commit ();
// ===================== FILTER =====================
session. beginTransaction ();
System.out. println ( "=== Mitglieder aus Berlin ===" );
List< Mitglied > filtered = session
. createQuery ( "from Mitglied m where m.ort.name=:ortName" ,
Mitglied.class)
. setParameter ( "ortName" , "Berlin" ). list ();
filtered. forEach (m -> System.out. println (m. getName ()));
session. getTransaction (). commit ();
// ===================== UPDATE =====================
session. beginTransaction ();
anna = session. get (Mitglied.class, anna. getId ());
anna. setName ( "Anna Müller" );
session. getTransaction (). commit ();
// ===================== DELETE =====================
session. beginTransaction ();
for (Sportart s : ben. getSportarten ()) {
s. getMitglieder (). remove ((ben));
}
ben. getSportarten (). clear ();
ben. getOrt (). getMitglieder (). remove (ben);
ben. setOrt ( null );
session. remove (ben); // Mitglied Ben löschen
session. getTransaction (). commit ();
} catch (Exception e ) {
System.err. println (e);
} finally {
session. close ();
factory. close ();
}
}
}