chciałbym się pobawić z bazami danych. Robię projekt w mavenie
Masz gotowca do "nauki z main'em"
Weź MySQL z Dockera
docker run -d -p 3306:3306 -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=1234 --name=mysql mysql/mysql-server:latest
user: root
password: 1234
src/main/resources/hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306</property>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
<property name="connection.pool_size">1</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
</session-factory>
</hibernate-configuration>
Możesz dodać logger
src/main/resources/log4j.properties
log4j.rootLogger=TRACE, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.logger.org.hibernate=WARN
log4j.logger.org.hibernate.SQL=INFO
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release> <!--or <release>10</release>-->
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok-maven-plugin -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.18.12.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.27.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>
package com.app.util;
import com.app.domain.Animal;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
private HibernateUtil() {
}
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
createSessionFactory();
}
return sessionFactory;
}
private static void createSessionFactory() {
final Configuration configuration = new Configuration()
.addAnnotatedClass(Animal.class)
.configure();
final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
}
package com.app.domain;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "animal")
@Data
@NoArgsConstructor
public class Animal {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column
private String name;
public Animal(String name) {
this.name = name;
}
}
package com.app;
import com.app.domain.Animal;
import com.app.util.HibernateUtil;
import org.hibernate.Session;
public class App {
public static void main(String[] args) {
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
final Animal felix = new Animal("Felix");
session.getTransaction().begin();
session.persist(felix);
session.getTransaction().commit();
}
}
}
Jak podepniesz logger na konsolę to zobaczysz więcej szczegółów co i jak się dzieje
DEBUG - Logging Provider: org.jboss.logging.Log4jLoggerProvider
WARN - HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Hibernate:
drop table if exists animal
Hibernate:
drop table if exists hibernate_sequence
Hibernate:
create table animal (
id bigint not null,
name varchar(255),
primary key (id)
) engine=InnoDB
Hibernate:
create table hibernate_sequence (
next_val bigint
) engine=InnoDB
Hibernate:
insert into hibernate_sequence values ( 1 )
Hibernate:
select
next_val as id_val
from
hibernate_sequence for update
Hibernate:
update
hibernate_sequence
set
next_val= ?
where
next_val=?
Hibernate:
/* insert com.app.domain.Animal
*/ insert
into
animal
(name, id)
values
(?, ?)
TRACE - binding parameter [1] as [VARCHAR] - [Felix]
TRACE - binding parameter [2] as [BIGINT] - [1]
Poczytaj sobie tylko co w hibernate.cfg.xml robi
<property name="hibernate.hbm2ddl.auto">create-drop</property>
I masz (odpaliłem, sprawdziłem) wszystko żeby się uczyć
Po stronie bazy danych
select * from animal
[2021-02-15 17:46:17] 1 row retrieved starting from 1 in 215 ms (execution: 14 ms, fetching: 201 ms)
Ps
Weź MySQL (może być Postgres), ale więcej jak do MySQL to info na początek nauki i tego typu problemy, to nie znajdziesz w sieci.
I polecam Docker, a nie lokalne H2
PS OT
Spróbowałem sobie wyestymować ile czasu mi zajmie napisanie takiej pełnej odpowiedzi i przetestowanie kodu.
Nie wymyślałem koła, konfiguracja.
Wyszła tak zwana chwila-moment. - Przecież to chwila-moment, zajmij się tym jak możesz.
"Jakbyśmy 2 takie chwile-moment mieli to byśmy se sami..."
#pdk