连接到 Oracle 数据库时创建会话工厂时出现空指针异常



我很难使用休眠连接到oracle数据库。

我在行收到空指针异常

sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();

这是 Eclipse 控制台记录的内容

Apr 11, 2018 11:05:05 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.6.Final}
Apr 11, 2018 11:05:05 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Apr 11, 2018 11:05:06 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Apr 11, 2018 11:05:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
The sessionFactory was not created. Could not connect to the database
Apr 11, 2018 11:05:06 PM org.hibernate.service.internal.AbstractServiceRegistryImpl stopService
INFO: HHH000369: Error stopping service [class org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl] : java.lang.NullPointerException

设置函数创建会话工厂

public class DatabaseConnectionManager {
    protected static SessionFactory sessionFactory;
    protected static StandardServiceRegistry serviceRegistry;
        /**
         * Creates a sessionFactory instance and thus the connection to the database
         * 
         */
        public void setup() {
            final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                    .configure( "hibernate.cfg.xml") // configures settings from hibernate.cfg.xml
                    .build();
            try {
               sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();

            } catch (Exception ex) {
                System.out.println("The sessionFactory was not created. Could not connect to the database");
                StandardServiceRegistryBuilder.destroy(registry);
            }
            if (sessionFactory != null) 
                System.out.println("Successfully connected  to the database");
        }
    }

这是我的POJO

@Entity
@Table(name = "denomination_inventory")
public class DenominationCount {
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "C")
    private int c;
    @Column(name = "L")
    private int l;
    @Column(name = "XX")
    private int xx;
    @Column(name = "X")
    private int x;
    @Column(name = "V")
    private int v;
    @Column(name = "II")
    private int ii;
    @Column(name = "I")
    private int i;
    @Column(name = "DATE_TIME")
    private LocalDateTime dateTime;
    public DenominationCount() {
        super();
    }
    /**
     * Gets the entity's id
     * 
     * @return an int representing the entity's id
     */
    public int getId() {
        return id;
    }
    /**
     * Sets the entity's id
     * 
     * @param id
     *            an int containing the entity's id
     */
    public void setId(int id) {
        this.id = id;
    }
    /**
     * Gets the number of coins for the One Pound denomination
     * 
     * @return an int representing the number of coins for the One Pound
     *         denomination
     */
    public int getC() {
        return c;
    }
    /**
     * Sets the entity's number of coins for the One Pound denomination
     * 
     * @param c
     *            an int containing the number of coins for the One Pound
     *            denomination
     */
    public void setC(int c) {
        this.c = c;
    }
    /**
     * Gets the number of coins for the Fifty Pence denomination
     * 
     * @return an int representing the number of coins for the Fifty Pence
     *         denomination
     */
    public int getL() {
        return l;
    }
    /**
     * Sets the entity's number of coins for the Fifty Pence denomination
     * 
     * @param c
     *            an int containing the number of coins for the Fifty Pence
     *            denomination
     */
    public void setL(int l) {
        this.l = l;
    }
    /**
     * Gets the number of coins for the Twenty Pence denomination
     * 
     * @return an int representing the number of coins for the Twenty Pence
     *         denomination
     */
    public int getXX() {
        return xx;
    }
    /**
     * Sets the entity's number of coins for the Twenty Pence denomination
     * 
     * @param c
     *            an int containing the number of coins for the Twenty Pence
     *            denomination
     */
    public void setXX(int xx) {
        this.xx = xx;
    }
    /**
     * Gets the number of coins for the Ten Pence denomination
     * 
     * @return an int representing the number of coins for the Ten Pence
     *         denomination
     */
    public int getX() {
        return x;
    }
    /**
     * Sets the entity's number of coins for the Ten Pence denomination
     * 
     * @param c
     *            an int containing the number of coins for the Ten Pence
     *            denomination
     */
    public void setX(int x) {
        this.x = x;
    }
    /**
     * Gets the number of coins for the Five Pence denomination
     * 
     * @return an int representing the number of coins for the Five Pence
     *         denomination
     */
    public int getV() {
        return v;
    }
    /**
     * Sets the entity's number of coins for the Five Pence denomination
     * 
     * @param c
     *            an int containing the number of coins for the Five Pence
     *            denomination
     */
    public void setV(int v) {
        this.v = v;
    }
    /**
     * Gets the number of coins for the Two Pence denomination
     * 
     * @return an int representing the number of coins for the Two Pence
     *         denomination
     */
    public int getII() {
        return ii;
    }
    /**
     * Sets the entity's number of coins for the Two Pence denomination
     * 
     * @param c
     *            an int containing the number of coins for the Two Pence
     *            denomination
     */
    public void setII(int ii) {
        this.ii = ii;
    }
    /**
     * Gets the number of coins for the One Penny denomination
     * 
     * @return an int representing the number of coins for the One Penny
     *         denomination
     */
    public int getI() {
        return i;
    }
    /**
     * Sets the entity's number of coins for the One Penny denomination
     * 
     * @param c
     *            an int containing the number of coins for the One Penny
     *            denomination
     */
    public void setI(int i) {
        this.i = i;
    }
    /**
     * Gets the entity's time of insertion into the database
     * 
     * @return a datetime representing the time when the entity was inserted into
     *         the database
     */
    public LocalDateTime getDateTime() {
        return dateTime;
    }
    /**
     * Sets the entity's time of insertion into the database
     * 
     * @param dateTime
     *            a datetime containing the time when the entity was inserted into
     *            the database
     */
    public void setDateTime(LocalDateTime dateTime) {
        this.dateTime = dateTime;
    }
    @Override
    public String toString() {
        return "DenominationCount [Id=" + id + ", 100=" + c + ", 50=" + l + ", 20=" + xx + ", 10=" + x + ", 5=" + v
                + ", 2=" + ii + ", 1=" + i + ", Data=" + dateTime + "]";
    }
}

这是主文件(在控制器的构造函数中调用设置函数(

public class AppEngine {
    public static void main(String[] args) throws InsufficientCoinageException {
        CoinCountController controller = new CoinCountController();
}
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>      
  <session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property> 
    <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
    <property name="hibernate.connection.username">cosmin</property>
    <property name="hibernate.connection.password">123456</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.connection.release_mode">auto</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.connection.autoReconnect">true</property>
    <mapping class="vmproj.model.entity.DenominationCount" />
  </session-factory>
</hibernate-configuration>

如果我从配置文件中删除此行

name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>

(我也尝试过使用 SID 进行连接,但没有任何成功(

然后创建会话工厂并建立连接,但仍当我尝试将记录更新到数据库中时

这是我的控制台显示的内容

Apr 11, 2018 11:20:20 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.6.Final}
Apr 11, 2018 11:20:20 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Apr 11, 2018 11:20:20 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Apr 11, 2018 11:20:21 PM org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService
WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections
Apr 11, 2018 11:20:21 PM org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator initiateService
WARN: HHH000342: Could not obtain connection to query metadata : The application must supply JDBC connections
Apr 11, 2018 11:20:21 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.OracleDialect
Apr 11, 2018 11:20:21 PM org.hibernate.dialect.Oracle9Dialect <init>
WARN: HHH000063: The Oracle9Dialect dialect has been deprecated; use either Oracle9iDialect or Oracle10gDialect instead
Apr 11, 2018 11:20:21 PM org.hibernate.dialect.OracleDialect <init>
WARN: HHH000064: The OracleDialect dialect has been deprecated; use Oracle8iDialect instead
Apr 11, 2018 11:20:21 PM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl makeLobCreatorBuilder
INFO: HHH000422: Disabling contextual LOB creation as connection was null
Successfully connected  to the database
Exception in thread "main" java.lang.UnsupportedOperationException: The application must supply JDBC connections
    at org.hibernate.engine.jdbc.connections.internal.UserSuppliedConnectionProviderImpl.getConnection(UserSuppliedConnectionProviderImpl.java:44)
    at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:99)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:129)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:247)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:254)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:203)
    at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:56)
    at org.hibernate.internal.AbstractSharedSessionContract.beginTransaction(AbstractSharedSessionContract.java:401)

编辑:

我添加了一个打印堆栈跟踪,这就是问题所在

  Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [oracle.jdbc.driver.OracleDriver]

虽然我在 Maven 存储库中有 ojdbc8

我添加了旧版本的 ojdbc 驱动程序,现在它可以工作了。 问题已解决

最新更新