我很难使用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 + "]";
}
}
这是主文件(在控制器的构造函数中调用setup函数)
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
答案 0 :(得分:0)
我添加了旧版本的ojdbc驱动程序,现在它可以工作了。问题解决了