首页 > 解决方案 > 线程“主”java.lang.NoSuchMethodError 中的异常:'javax.persistence.Index[] javax.persistence.Table.indexes()'

问题描述

我已经检查了一些与此问题相关的主题,但到目前为止似乎没有任何解决方案。所有这些错误都是通过添加持久性依赖来解决的,但在我的情况下它没有帮助。我已经尝试添加 java-persistence-api 1.0.2 而不是 v2.1,我还清理了我的 maven 存储库并重新下载了我的依赖项几次。我只熟悉 npm/yarn,所以我对在 java maven 中解决此类问题了解一些。如果我删除所有这些持久性注释,代码将成功运行。

用户实体.java

package Entities;

import Utils.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name="USER", uniqueConstraints = {
        @UniqueConstraint(columnNames = "UserId"),
        @UniqueConstraint(columnNames = "userEmail")
})
public class UserEntity {
    @Column(name="userName", unique = false, nullable = false, length = 36)
    private String userName;
    @Column(name="userLogin", unique = false, nullable = false, length = 36)
    private String userLogin;
    @Column(name="userPassword", unique = false, nullable = false, length = 24)
    private String userPassword;
    @Column(name="userEmail", unique = true, nullable = false, length = 100)
    private String userEmail;
    @Column(name="userRole", unique = false, nullable = false, length = 12)
    private Integer userRole;
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name="userId", unique = true, nullable = false)
    private Integer userId;


    public UserEntity(String userName, String userLogin, String userPassword, String userEmail, Integer userRole) {
        this.userName = userName;
        this.userLogin = userLogin;
        this.userPassword = userPassword;
        this.userEmail = userEmail;
        this.userRole = userRole;
    }

    public UserEntity() {}

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public String toString() {
        return "UserEntity{" +
                "userName='" + userName + '\'' +
                ", userLogin='" + userLogin + '\'' +
                ", userPassword='" + userPassword + '\'' +
                ", userEmail='" + userEmail + '\'' +
                ", userRole=" + userRole +
                ", userId=" + userId +
                '}';
    }

    public String getUserLogin() {
        return userLogin;
    }

    public void setUserLogin(String userLogin) {
        this.userLogin = userLogin;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public String getUserEmail() {
        return userEmail;
    }

    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail;
    }

    public Integer getUserRole() {
        return userRole;
    }

    public void setUserRole(Integer userRole) {
        this.userRole = userRole;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }


}

DBRequestController.java

package Controllers;

import Utils.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;

import java.util.List;

public class DBRequestController<T> implements IDBRequestController<T>{
    private final Class<T> type;

    public DBRequestController(Class<T> type) {
        this.type = type;
    }

    public String getMyType() {
        return this.type.toString().substring(15);
    }

    @Override
    public void update(T object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.update(object);
        transaction.commit();
        session.close();
    }

    @Override
    public void add(T object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.save(object);
        transaction.commit();
        session.close();
    }

    @Override
    public void delete(T object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();
        session.delete(object);
        transaction.commit();
        session.close();
    }

    @Override
    public List<T> showAll() {
        String hql = "from " + this.getMyType();
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.getTransaction().begin();
        List<T> objects = session.createQuery(hql).getResultList();
        session.getTransaction().commit();
        return objects;
    }
}

休眠.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL94Dialect</property>
        <property name="hibernate.connection.username">postgres</property>
        <property name="hibernate.connection.password">12344321</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/CustomsDB</property>

        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="connection.pool_size">30</property>
        <property name="show_sql">true</property>

        <mapping class="Entities.Cart"/>
        <mapping class="Entities.UserEntity"/>
        <mapping class="Entities.DeclaredUnit"/>
        <mapping class="Entities.UnitDesc"/>
        <mapping class="Entities.UnitType"/>
        <mapping class="Entities.CartUnit"/>

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

pom.xml

<?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>Server</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>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.29.Final</version>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.19</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.4.29.Final</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

HibernateUtil.java

package Utils;

import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class HibernateUtil {

    private static SessionFactory sessionFactory = buildSessionFactory();

    protected static SessionFactory buildSessionFactory() {
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure()
                .build();
        try {
            sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        } catch (Exception e) {
            StandardServiceRegistryBuilder.destroy(registry);

            throw new ExceptionInInitializerError("Initial SessionFactory failed" + e);
        }
        return sessionFactory;
    }


    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void shutdown() {
        getSessionFactory().close();
    }

}

错误

Oct 17, 2021 6:52:24 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate ORM core version 5.4.29.Final
Oct 17, 2021 6:52:32 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
Oct 17, 2021 6:52:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Oct 17, 2021 6:52:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [null] at URL [jdbc:postgresql://localhost:5432/CustomsDB]
Oct 17, 2021 6:52:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=postgres}
Oct 17, 2021 6:52:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Oct 17, 2021 6:52:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 30 (min=1)
Oct 17, 2021 6:52:35 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL94Dialect
Exception in thread "main" java.lang.NoSuchMethodError: 'javax.persistence.Index[] javax.persistence.Table.indexes()'
    at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:1238)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:840)
    at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:248)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:239)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:282)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:86)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:479)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:85)
    at org.hibernate.boot.MetadataSources.buildMetadata(MetadataSources.java:202)
    at Utils.HibernateUtil.buildSessionFactory(HibernateUtil.java:17)
    at Utils.HibernateUtil.<clinit>(HibernateUtil.java:10)
    at Controllers.DBRequestController.add(DBRequestController.java:31)
    at Program.main(Program.java:9)

标签: javahibernatemaven

解决方案


推荐阅读