From ecb78465655b24d5c301458c578a885142fd3ba9 Mon Sep 17 00:00:00 2001 From: Gavin Date: Sat, 13 May 2023 09:44:47 +0200 Subject: [PATCH] hello world --- .../introduction/Hibernate_Introduction.adoc | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/documentation/src/main/asciidoc/introduction/Hibernate_Introduction.adoc b/documentation/src/main/asciidoc/introduction/Hibernate_Introduction.adoc index 0cc1657114..b590b2b452 100644 --- a/documentation/src/main/asciidoc/introduction/Hibernate_Introduction.adoc +++ b/documentation/src/main/asciidoc/introduction/Hibernate_Introduction.adoc @@ -215,6 +215,158 @@ This introduction will guide you through the basic tasks involved in developing Naturally, we'll start at the top of this list, with the least-interesting topic: _configuration_. +[[hello-world]] +=== Hello World! + +Before we get into the weeds, we'll quickly present a basic example program that will help you get started if you don't already have Hibernate integrated into your project. + +We begin with a simple gradle build file: + +[source,groovy] +.`build.gradle` +---- +plugins { + id 'java' +} + +group = 'org.example' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + // the GOAT ORM + implementation 'org.hibernate.orm:hibernate-core:6.2.2.Final' + + // Agroal connection pool + implementation 'org.hibernate.orm:hibernate-agroal:6.2.2.Final' + implementation 'io.agroal:agroal-pool:2.1' + + // logging via Log4j + implementation 'org.apache.logging.log4j:log4j-core:2.20.0' + + // JPA metamodel generator (for criteria queries) + annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen:6.2.2.Final' + + // H2 database + runtimeOnly 'com.h2database:h2:2.1.214' +} +---- + +Only the first of these dependencies is absolutely _required_ to run Hibernate. + +Next, we'll add a logging configuration file for log4j: + +[source,properties] +.`log4j2.properties` +---- +rootLogger.level = info +rootLogger.appenderRefs = console +rootLogger.appenderRef.console.ref = console + +logger.hibernate.name = org.hibernate.SQL +logger.hibernate.level = info + +appender.console.name = console +appender.console.type = Console +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = %highlight{[%p]} %m%n +---- + +Now we need some Java code. +We begin with our _entity class_: + +[source,java] +.`Book.java` +---- +package org.hibernate.example; + +import jakarta.persistence.Basic; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +class Book { + @Id + String isbn; + + @Basic(optional = false) + String title; + + Book() {} + + Book(String isbn, String title) { + this.isbn = isbn; + this.title = title; + } +} +---- + +Finally, the code which configures and instantiates Hibernate and asks it to persist and query the entity: + +[source,java] +.`Main.java` +---- +package org.hibernate.example; + +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Root; +import org.hibernate.cfg.Configuration; + +import static java.lang.Boolean.TRUE; +import static java.lang.System.out; +import static org.hibernate.cfg.AvailableSettings.*; + +public class Main { + public static void main(String[] args) { + var sessionFactory = new Configuration() + .addAnnotatedClass(Book.class) + // use H2 in-memory database + .setProperty(URL, "jdbc:h2:mem:db1") + .setProperty(USER, "sa") + .setProperty(PASS, "") + // use Agroal connection pool + .setProperty("hibernate.agroal.maxSize", "20") + // display SQL in console + .setProperty(SHOW_SQL, TRUE.toString()) + .setProperty(FORMAT_SQL, TRUE.toString()) + .setProperty(HIGHLIGHT_SQL, TRUE.toString()) + .buildSessionFactory(); + + // export the inferred database schema + sessionFactory.getSchemaManager().exportMappedObjects(true); + + + // persist an entity + sessionFactory.inTransaction(session -> { + session.persist(new Book("9781932394153", "Hibernate in Action")); + }); + + // query data using HQL + sessionFactory.inSession(session -> { + out.println(session.createSelectionQuery("select isbn||': '||title from Book").getSingleResult()); + }); + + // query data using criteria API + sessionFactory.inSession(session -> { + CriteriaBuilder builder = sessionFactory.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery(String.class); + Root record = query.from(Book.class); + query.select(builder.concat(builder.concat(record.get(Book_.isbn), builder.literal(": ")), + record.get(Book_.title))); + out.println(session.createSelectionQuery(query).getSingleResult()); + }); + } +} +---- + +Here we've used Hibernate's native APIs. +We could have used JPA-standard APIs to achieve the same thing. +In that case, we need to use XML to configure Hibernate. + include::Configuration.adoc[] include::Entities.adoc[] include::Mapping.adoc[]