Ошибка при сохранении данных hibernate

Я пытаюсь сохранить данные и выходит ошибка мой код в JavaGuru:

import org.hibernate.cfg.Configuration;

import java.time.LocalDate;

public class JavaGuru {
    public static void main(String[] args) {


        Configuration configuration = new Configuration().configure();
        configuration.addAnnotatedClass(User.class);

        try (var sessionFactory = configuration.buildSessionFactory();
             var session = sessionFactory.openSession()) {
            session.beginTransaction();

            session.save(User.builder()
                            .username("[email protected]")
                            .firstname("Ivan")
                            .lastname("Ivanov")
                            .birthDate(LocalDate.of(2000, 01, 01))
                            .age(23)
                    .build());

            session.getTransaction().commit();
        }

    }
}  `

так же мой код в самом user:

`package org.example;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDate;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "users", schema = "public")
public class User {
    @Id
private String username;
private String firstname;
private String lastname;
private LocalDate birthDate;
private Integer age;
}`



hibernate.cfg.xml:
`
<hibernate-configuration>
    <session-factory>

        <property name="dialect">org.hibernate.dialect.PostgresDialect</property>
        <property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="connection.url">jdbc:postgresql://localhost:5432/postgres</property>
        <property name="connection.username">root</property>
        <property name="connection.password">password</property>
        <poperty name="hibernate.show_sql ">true</poperty>
        <property name="hbm2ddl.auto">update</property>
        <property name="format_sql">true</property>


        <mapping class="by.stroka.hibernate"/>

    </session-factory>
</hibernate-configuration>`

и выходит данная ошибка:

дек. 13, 2023 10:01:02 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.4.4.Final}
Exception in thread "main" org.hibernate.internal.util.config.ConfigurationException: Unable to perform unmarshalling at line number 0 and column 0 in RESOURCE hibernate.cfg.xml. Message: null
    at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:133)
    at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:65)
    at org.hibernate.boot.cfgxml.internal.ConfigLoader.loadConfigXmlResource(ConfigLoader.java:57)
    at org.hibernate.boot.registry.StandardServiceRegistryBuilder.configure(StandardServiceRegistryBuilder.java:165)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:258)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:244)
    at org.example.JavaGuru.main(JavaGuru.java:11)
Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:421)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662)
    at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:122)
     6 more
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122)
    at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:276)
    10 more

Ответы (1 шт):

Автор решения: Alex Krass

Версия Hibernate 5.4.4. уже довольно старая, к тому же конкретно эта версия имеет уязвимости, описанные в maven репозитории.

У Hibernate идет зависимость от JAXB, который был удален в более новых версиях Java 11+, поэтому вам его надо подключить самостоятельно. При этом для старой библиотеки Hibernate подключать старую версию.

https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api

Кликните на версию, к примеру 2.3.1 и там будет код для maven/gradle/etc и библиотека в чистом виде. Так же в статьях интернета рекомендуют подключать еще jaxb-runtime, возможно ошибки еще будут.

https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime/2.3.0.1

Но по хорошему желательно перейти на версию посвежее.

→ Ссылка