Ошибка при сохранении данных 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 шт):
Версия 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
Но по хорошему желательно перейти на версию посвежее.