ORM für Java: Vergleich und Beispiele
ORM (Object-Relational Mapping) ist eine Technologie, die das objektorientierte Java-Modell mit relationalen Datenbanken verbindet. Sie erspart dem Entwickler das Schreiben von boilerplate SQL-Code und ermöglicht es, mit Daten wie mit gewöhnlichen Java-Objekten zu arbeiten. In Java sind drei Ansätze am beliebtesten: Hibernate (vollwertiges ORM), MyBatis (SQL Mapper) und JPA (Java-Standard). In diesem Artikel vergleichen wir sie anhand praktischer Beispiele.
1. JPA (Java Persistence API)
JPA ist eine Spezifikation (ein Standard), keine konkrete Implementierung. Die beliebteste Implementierung ist Hibernate, aber es gibt auch andere (EclipseLink, OpenJPA). JPA bietet Annotationen für das Mapping von Entitäten und unterstützt JPQL (Java Persistence Query Language).
Beispiel einer JPA-Entität:
import javax.persistence.*;
@Entity@Table(name = "users")public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@Column(name = "username", nullable = false, length = 50) private String username;
@Column(name = "email") private String email;
// Getter und Setter public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }}Beispiel für das Speichern mit EntityManager:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");EntityManager em = emf.createEntityManager();
em.getTransaction().begin();User user = new User();user.setUsername("ivan");user.setEmail("ivan@example.com");em.persist(user);em.getTransaction().commit();
em.close();emf.close();2. Hibernate
Hibernate ist das ausgereifteste und funktionsreichste ORM für Java. Es implementiert JPA vollständig, hat aber auch eigene Erweiterungen. Hibernate generiert automatisch SQL, verwaltet Caching, unterstützt Lazy Loading und kaskadierende Operationen.
Beispiel für ein Mapping mit Hibernate (unter Verwendung von JPA-Annotationen):
import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity@Table(name = "orders")@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)public class Order { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "order_seq") @SequenceGenerator(name = "order_seq", sequenceName = "order_sequence", allocationSize = 1) private Long id;
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user;
@Column(name = "total_amount") private Double totalAmount;
// Getter und Setter}Beispiel für eine Abfrage mit der Hibernate Criteria API:
Session session = sessionFactory.openSession();CriteriaBuilder builder = session.getCriteriaBuilder();CriteriaQuery<User> query = builder.createQuery(User.class);Root<User> root = query.from(User.class);query.select(root).where(builder.equal(root.get("username"), "ivan"));
List<User> users = session.createQuery(query).getResultList();session.close();3. MyBatis
MyBatis ist kein vollwertiges ORM, sondern ein SQL Mapper. Es generiert kein SQL automatisch, sondern bietet einen flexiblen Mechanismus zum Schreiben eigener SQL-Abfragen mit Mapping der Ergebnisse auf Java-Objekte. MyBatis ist ideal, wenn Sie die volle Kontrolle über SQL und die Leistung benötigen.
Beispiel für ein Mapping in XML (UserMapper.xml):
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUser" resultType="User">\ Auch in der Bibliothek
Arbeit mit XML in Kotlin: Bibliotheken und Werkzeuge für Parsing und Erstellung
Serde für Rust: Vollständige Anleitung mit Beispielen
AddressSanitizer C++: Komplette Anleitung mit Beispielen