JPA/Hibernate błąd przy imporcie

0

Witam, chciałbym się pobawić z bazami danych. Robię projekt w mavenie i w pom.xml takie dependencję:

    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.197</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.28.Final</version>
        </dependency>


    </dependencies>

I teoretycznie dodają się one dobrze, bo nie ma żadnych błędów. Cały plik .pom wygląda tak:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>BD</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>15</maven.compiler.source>
        <maven.compiler.target>15</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.197</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.28.Final</version>
        </dependency>


    </dependencies>
</project>

Dodatkowo stworzyłem plik persistence.xml w folderze META-INF

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

    <persistence-unit name="ClockworkPersistence" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <properties>
            <property name="connection.driver_class" value="org.h2.Driver"/>
            <property name="hibernate.connection.url" value="jdbc:h2:./db/repository"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

Kompletnie nie wiem co może być nie tak.

2

Dobrze zacząłeś ale bugi zgłasza się tak:

  1. Co zrobiłeś (to napisałeś)
  2. Czego oczekiwałeś (tego brakuje)
  3. Co dostałeś w zamian (tego brakuje)
1

Być może coś nie tak z konfiguracją wersji (miałem podobny problem z Java 11) Spróbuj tak:

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <release>11</release>
        </configuration>
      </plugin>
    </plugins>
  </build>

0

@Aleksander32: Niestety nie działa.

@Shalom:
Chciałem w pliku klasy zaimportować

import javax.persistence.EntityManager

W celu stworzenia obiektu

 EntityManagerFactory 

Przy imporcie mam błąd:

Cannot resolve symbol 'persistence'

Moje IDE to IntelliJ

0

javax.persistence... to JPA/JEE a nie Hibernate. Brakuje ci zalezności na jakieś javax persistence api

0

Dodałem dependencję

   <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
  </dependency>

I wciąż nie działa. Dodatkowo próbując działać na Hibernete używając Session to też nie działa.

0
Wywolany napisał(a):

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1