Java 为什么要冬眠;找不到命名参数";何时从属性文件读取属性?

Java 为什么要冬眠;找不到命名参数";何时从属性文件读取属性?,java,hibernate,properties,Java,Hibernate,Properties,同事们,我有HibernateUtil.class返回sessionFactory: public class HibernateUtil { private static final Logger LOG = Logger.getLogger(HibernateUtil.class.getName()); private static final SessionFactory sessionFactory; static { try {

同事们,我有HibernateUtil.class返回sessionFactory:

public class HibernateUtil {
    private static final Logger LOG = Logger.getLogger(HibernateUtil.class.getName());
    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from app.properties

            java.util.Properties properties = new Properties();
            properties.load(new FileInputStream("src//main//resources//app.properties"));
            Configuration configuration = new Configuration();

            configuration.configure("hibernate.cfg.xml").addProperties(properties);;

            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties()).build();

            sessionFactory = new Configuration().configure().buildSessionFactory(serviceRegistry);


        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            LOG.info("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
app.properties中有属性:

hibernate.connection.url=jdbc:oracle:thin:@srv.te.loc:1521:DB
hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.username=user
hibernate.connection.password=pass
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.current_session_context_class=thread
调用测试IDE时,显示:

02.02.2016 10:37:08.592 INFO  ApplicationDAOImpl:53 - Get application status for Application with № 00000000009240
02.02.2016 10:37:08.961 INFO  Version:37 - HHH000412: Hibernate Core {5.0.7.Final}
02.02.2016 10:37:08.965 INFO  Environment:213 - HHH000206: hibernate.properties not found
02.02.2016 10:37:08.968 INFO  Environment:317 - HHH000021: Bytecode provider name : javassist
02.02.2016 10:37:09.105 WARN  deprecation:91 - 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.
02.02.2016 10:37:09.931 WARN  deprecation:91 - 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.
02.02.2016 10:37:10.018 INFO  Version:66 - HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
02.02.2016 10:37:10.171 WARN  connections:71 - HHH10001002: Using Hibernate built-in connection pool (not for production use!)
02.02.2016 10:37:10.452 INFO  connections:127 - HHH10001005: using driver [oracle.jdbc.driver.OracleDriver] at URL [jdbc:oracle:thin:@srv-pwcdb01.is.loc:1521:PWCDB]
02.02.2016 10:37:10.454 INFO  connections:136 - HHH10001001: Connection properties: {user=user, password=****}
02.02.2016 10:37:10.455 INFO  connections:141 - HHH10001003: Autocommit mode: false
02.02.2016 10:37:10.464 INFO  DriverManagerConnectionProviderImpl:39 - HHH000115: Hibernate connection pool size: 20 (min=1)
02.02.2016 10:37:10.795 INFO  Dialect:156 - HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect
02.02.2016 10:37:11.311 INFO  ApplicationDAOImpl:65 - Session Is Opened :: true
02.02.2016 10:37:11.312 INFO  ApplicationDAOImpl:66 - Session Is Connected :: true
02.02.2016 10:37:11.325 WARN  QuerySplitter:124 - HHH000183: no persistent classes found for query class: from com.comp.db.entity.Applications where applicationNumber = :applicationNumber
02.02.2016 10:37:11.332 INFO  QueryTranslatorFactoryInitiator:47 - HHH000397: Using ASTQueryTranslatorFactory
org.hibernate.QueryParameterException: could not locate named parameter [applicationNumber]
    at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterDescriptor(ParameterMetadata.java:131)
    at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterExpectedType(ParameterMetadata.java:148)
    at org.hibernate.internal.AbstractQueryImpl.determineType(AbstractQueryImpl.java:517)
    at org.hibernate.internal.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:487)
    at ru.com.isbank.db.DAO.ApplicationDAOImpl.getPcoApplicationIBStatus(ApplicationDAOImpl.java:71)
    at ru.com.isbank.db.DAO.ApplicationDAOImplTest.testGetPcoApplicationIBStatus(ApplicationDAOImplTest.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
java.lang.NullPointerException
    at ru.com.isbank.db.DAO.ApplicationDAOImpl.getApplicationStatus(ApplicationDAOImpl.java:87)
    at ru.com.isbank.db.DAO.ApplicationDAOImplTest.testGetApplicationStatus(ApplicationDAOImplTest.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
如果我在标准hibernate.cfg.xml中使用相同的属性(url、pass、方言),并从
new Configuration().configure().buildSessionFactory(serviceRegistry)
中删除
serviceRegistry
,则相同的测试工作正常

我的属性文件或HibernateUtil类有什么问题

另外,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.pool_size">10</property>
    <property name="hibernate.default_schema">defschema</property>
    <property name="show_sql">false</property>
    <property name="hibernate.connection.autocommit">false</property>

    <mapping class="com.comp.db.entity.Applications"/>
    <mapping resource="hbconfig/Applications.hbm.xml"></mapping>


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

10
defschema
错误的
错误的

我认为问题在于:

sessionFactory = new Configuration()...
为什么要实例化一个新配置,而不是重用上面几行初始化的旧配置

改为

sessionFactory = configuration.configure().buildSessionFactory(serviceRegistry);
编辑:

不使用ServiceRegistry,只需将属性添加到配置中,如下所示:

static {
    try {
        // Create the SessionFactory from app.properties

        Properties properties = new Properties();
        properties.load(new FileInputStream("src//main//resources//app.properties"));
        Configuration configuration = new Configuration();
        configuration.configure("hibernate.cfg.xml");
        configuration.addProperties(properties);
        sessionFactory = configuration.buildSessionFactory();

    } catch (Throwable ex) {
        // Make sure you log the exception, as it might be swallowed
        LOG.info("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

这对我有用。只需调试以确保加载后正确填充属性。

首先,配置Hibernate 5的方式不正确。详情请参阅

要使用非标准属性(使用属性文件的绝对路径)进行配置,可以执行以下操作

File propertiesPath = new File("some_path");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
    configure().loadProperties(propertiesPath).build();
SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry);  
将属性作为资源引用

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
    configure().loadProperties("app.properties").build();
SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry);  

您需要在类路径中具有
app.properties

您可以发布
hbconfig/Applications.hbm.xml
?通过例外情况显示该错误与Hibernate配置无关。抛出错误的是您在
ru.com.isbank.db.DAO.ApplicationDAOImpl.getPcoApplicationIBStatus
上使用的查询。@Mubin:我不这么认为,因为OP声明删除ServiceRegistry时一切都工作……是的,@Mubin:
删除ServiceRegistry时一切都工作
谢谢。但这没用。stacktrace是相同的。它不是一种非常正确的属性加载方式
properties.load(新文件输入流(“src//main//resources//app.properties”)