java - 无法使用 Hibernate 连接到 Informix

标签 java hibernate informix hibernate-5.x

我正在尝试使用 Hibernate 5.2.10 连接到 Informix 数据库,但是程序没有响应并且卡住了,并且没有抛出任何错误消息。

我在控制台中找不到任何内容。对我犯了什么错误有什么建议吗?我是 Hibernate 新手

hibernate.cfg.xml

<property name="connection.driver_class">com.informix.jdbc.IfxDriver</property>
<property name="connection.url">jdbc:informixsqli://****:1528/****:informixserver=*****</property>
<property name="connection.username">*****</property>
<property name="connection.password">*****</property>

控制台:

Sep 17, 2017 11:05:55 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.10.Final}
Sep 17, 2017 11:05:55 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Sep 17, 2017 11:06:05 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Sep 17, 2017 11:06:05 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH010002: C3P0 using driver: com.informix.jdbc.IfxDriver at URL: jdbc:informix-sqli://d7uat:1528/d7main:informixserver=uatserver
Sep 17, 2017 11:06:05 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH10001001: Connection properties: {user=******, password=****}
Sep 17, 2017 11:06:05 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH10001003: Autocommit mode: false
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Sep 17, 2017 11:06:07 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH10001007: JDBC isolation level: <unknown>
Sep 17, 2017 11:06:08 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.InformixDialect
Sep 17, 2017 11:06:14 AM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@7a0ef219] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.

HibernateUtil

private static final SessionFactory sessionFactory = buildSessionFactory();

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

private static SessionFactory buildSessionFactory(){
    final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
    try {
        return new 
     MetadataSources(registry).buildMetadata().buildSessionFactory();
    }
    catch (Throwable ex) {
        System.err.println("Initial SessionFactory creation failed." + ex);
        StandardServiceRegistryBuilder.destroy( registry );
        throw new ExceptionInInitializerError(ex);
    }
}

Informix测试

 public static CustomerInvoice lookupInvoice(String invoiceNumber){
    Session session = null;
    List<CustomerInvoice> customerInvoiceList = new ArrayList<CustomerInvoice>();
    CustomerInvoice customerInvoice = null;
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        Query query = session.createQuery(invoiceByNumber);
        query.setParameter("invoiceNumber", invoiceNumber+"%");
        customerInvoiceList = ((org.hibernate.query.Query) query).list();

    } catch (Exception e) {
        e.printStackTrace();
        session.close();
    } finally {
        if (session != null && session.isOpen()) {
            session.close();
        }
    }


    if(customerInvoiceList.size()>0){
        customerInvoice = customerInvoiceList.get(0);
    }

    return customerInvoice;

}

最佳答案

我使用 5.2 和最新的 jdbc 驱动程序进行了快速测试,它似乎对我来说工作得很好。我正在使用您的 HiberanateUtil 和类似的 Hibernate 配置文件:

D:\Infx\work\Hibernate>java list
Sep 18, 2017 10:53:49 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.11.Final}
Sep 18, 2017 10:53:49 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Sep 18, 2017 10:53:49 AM org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-configuration. Use namespace http://www.hibernate.org/dtd/hibernate-configuration instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
Sep 18, 2017 10:53:50 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Sep 18, 2017 10:53:50 AM org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
Sep 18, 2017 10:53:51 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Sep 18, 2017 10:53:51 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.informix.jdbc.IfxDriver] at URL [jdbc:informix-sqli://420ito:9088/stores7:INFORMIXSERVER=ids1210;user=informix;password=dummy;]
Sep 18, 2017 10:53:51 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {}
Sep 18, 2017 10:53:51 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Sep 18, 2017 10:53:51 AM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Sep 18, 2017 10:53:52 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.InformixDialect
Sep 18, 2017 10:53:53 AM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@37ebc9d8] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
Sep 18, 2017 10:53:55 AM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select state0_.id as id1_0_, state0_.code as code2_0_, state0_.sname as sname3_0_, state0_.next_state_id as next_sta4_0_ from States state0_ order by state0_.id asc
test, test
test, test
Sep 18, 2017 10:53:55 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:informix-sqli://420ito:9088/stores7:INFORMIXSERVER=ids1210;user=informix;password=dummy;]

D:\Infx\work\Hibernate>

我遇到“挂起”之类的情况的唯一方法是在打开 session 期间出现异常()。我强制使用旧的 Hibernate 版本库 (3.x) 来编译该方法,该库没有“经典”方法:

D:\Infx\work\Hibernate>java list
Sep 18, 2017 10:54:42 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.11.Final}
Sep 18, 2017 10:54:42 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Sep 18, 2017 10:54:42 AM org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-configuration. Use namespace http://www.hibernate.org/dtd/hibernate-configuration instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
Sep 18, 2017 10:54:42 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Sep 18, 2017 10:54:42 AM org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
Sep 18, 2017 10:54:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Sep 18, 2017 10:54:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.informix.jdbc.IfxDriver] at URL [jdbc:informix-sqli://420ito:9088/stores7:INFORMIXSERVER=ids1210;user=informix;password=dummy;]
Sep 18, 2017 10:54:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {}
Sep 18, 2017 10:54:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Sep 18, 2017 10:54:44 AM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Sep 18, 2017 10:54:44 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.InformixDialect
Sep 18, 2017 10:54:46 AM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@37ebc9d8] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
Exception in thread "main" java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
        at list.main(list.java:12)
....
.... 
....

正如您的,“最后”信息消息是“从 JdbcConnectionAccess 获得的连接”,但之后我也收到了 nosuchmethod 异常。我必须按 control+c 才能退出。

也许您的异常已发送到其他地方;)

编辑

这是我用来直接从控制台测试它的代码,应该是运行它所需的一切。

D:\Infx\work\Hibernate>cat set5.cmd
@echo off
set CLASSPATH=
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\javassist-3.20.0-GA.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\dom4j-1.6.1.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\hibernate-jpa-2.1-api-1.0.0.Final.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\hibernate-core-5.2.11.Final.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\hibernate-commons-annotations-5.0.1.Final.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\ifxjdbc.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\jta-1.1.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\classmate-1.3.0.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\jboss-logging-3.3.0.Final.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\antlr-2.7.7.jar
set CLASSPATH=%CLASSPATH%;.

D:\Infx\work\Hibernate>cat hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
   <hibernate-configuration>
   <session-factory >
   <property
      name="connection.driver_class">com.informix.jdbc.IfxDriver
   </property>
   <property
       name="connection.url">jdbc:informix-sqli://420ito:9088/stores7:INFORMIXSERVER=ids1210;user=informix;password=dummy;
   </property>
   <property
      name="dialect">org.hibernate.dialect.InformixDialect
   </property>
    <property name="hibernate.show_sql">true
   </property>

   <property
       name="current_session_context_class">thread
   </property>
<property name="hbm2ddl.auto">update</property>

   <mapping resource="State.hbm.xml"/>
   </session-factory>

</hibernate-configuration>

D:\Infx\work\Hibernate>cat State.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
   <class
      name="State"
      table="States">
      <id
         name="id"
         column="id">
         <generator class="increment"/>
      </id>

      <property
         name="code"
         column="code"/>
      <property
         name="sname"
         column="sname"/>
      <many-to-one
         name="nextState"
         cascade="all"
         column="next_state_id"/>
   </class>
</hibernate-mapping>

D:\Infx\work\Hibernate>cat HibernateUtil.java
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory();

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

private static SessionFactory buildSessionFactory(){
    final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
    try {
        return new
     MetadataSources(registry).buildMetadata().buildSessionFactory();
    }
    catch (Throwable ex) {
        System.err.println("Initial SessionFactory creation failed." + ex);
        StandardServiceRegistryBuilder.destroy( registry );
        throw new ExceptionInInitializerError(ex);
    }
}

  public static void shutdown() {
// Close caches and connection pools
     getSessionFactory().close();
  }

}

D:\Infx\work\Hibernate>cat create.java
import java.util.*;
import org.hibernate.*;
import javax.persistence.*;

public class create {
 public static void main(String[] args) {

   java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.FINEST  );
   java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.SEVERE  );
   Session Session = HibernateUtil.getSessionFactory().openSession();
   Transaction Transaction = Session.beginTransaction();

   State myState = new State();
   myState.setcode(args[0]);
   myState.setsname(args[1]);
   Long stateId = (Long) Session.save(myState);

   System.out.println("Stated added: "+myState.getcode()+", "+myState.getsname() );

   Transaction.commit();
   Session.close();
// Shutting down the application
   HibernateUtil.shutdown();
  }
}

D:\Infx\work\Hibernate>cat list.java
import java.util.*;
import org.hibernate.*;
import javax.persistence.*;

public class list {
 public static void main(String[] args) {

   java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.FINEST  ); 
   java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.SEVERE  );

   Session newSession = HibernateUtil.getSessionFactory().openSession();
   Transaction newTransaction = newSession.beginTransaction();
   List states = newSession.createQuery("from State order by id asc").list();

   for ( Iterator iter = states.iterator();
      iter.hasNext(); ) {
      State state = (State) iter.next();
      System.out.println(state.getcode() +", " + state.getsname() );
   }
   newTransaction.commit();
   newSession.close();

   HibernateUtil.shutdown();
  }
}
D:\Infx\work\Hibernate>

create.java 将插入一个新行,list.java 将从“State”表中选择:

D:\Infx\work\Hibernate>java com.informix.jdbc.Version
IBM Informix JDBC Driver Version 4.10.JC9

D:\Infx\work\Hibernate>javac create.java

D:\Infx\work\Hibernate>javac list.java

D:\Infx\work\Hibernate>java create test1 test2
Hibernate: select max(id) from States
Stated added: test1, test2
Hibernate: insert into States (code, sname, next_state_id, id) values (?, ?, ?, ?)

D:\Infx\work\Hibernate>java list
Hibernate: select state0_.id as id1_0_, state0_.code as code2_0_, state0_.sname as sname3_0_, state0_.next_state_id as next_sta4_0_ from States state0_ order by state0_.id asc
test, test
test, test
test1, test2

D:\Infx\work\Hibernate>

但我想它应该与您已经拥有的没有太大不同。

关于java - 无法使用 Hibernate 连接到 Informix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46266599/

相关文章:

java - 在多线程环境中选择后更新表

java - 如何捕获hibernate延迟加载?

java - 找到重复的主键时替换行

Informix future

java - For each 到 For 循环的转换

java - 如何通知 Java 程序数据库的数据已更改

java - 辛泰勒级数递归逼近

java - 如何在 spring hibernate 中将值列表插入数据表

java - Informix、MySQL 和 Oracle blob 包含

locking - Informix 表已锁定