gpt4 book ai didi

java - 连接oracle数据库时创建 session 工厂时出现空指针异常

转载 作者:太空宇宙 更新时间:2023-11-04 10:33:11 25 4
gpt4 key购买 nike

我很难使用 hibernate 连接到 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

setup函数创建SessionFactory

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 + "]";
}

}

这是主文件(在 Controller 的构造函数中调用设置函数)

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 连接,但没有成功)

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

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

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)

编辑:

我添加了 printstacktrace,这就是问题

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

虽然我在 Maven 存储库中有 ojdbc8

最佳答案

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

关于java - 连接oracle数据库时创建 session 工厂时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49783924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com