我使用的是Hibernate最新版本4.3.5.Final
。
我的hibernate.cfg.xml
文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/Test</property>
<property name="hibernate.connection.username">pankaj</property>
<property name="hibernate.connection.password">xxxx</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
创建SessionFactory的实用程序类:
package com.example;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
System.out.println("Hibernate Configuration loaded");
SessionFactory sessionFactory = configuration.buildSessionFactory(new StandardServiceRegistryBuilder().build());
return sessionFactory;
}
catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
当我在main()
方法中使用它时,我得到以下异常:
May 04, 2014 11:55:56 PM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Configuration loaded
May 04, 2014 11:55:57 PM org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService
WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections
Initial SessionFactory creation failed.org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.example.HibernateUtil.buildSessionFactory(HibernateUtil.java:25)
at com.example.HibernateUtil.<clinit>(HibernateUtil.java:9)
at com.example.HibernateMain.main(HibernateMain.java:26)
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:104)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:71)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:209)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
at com.example.HibernateUtil.buildSessionFactory(HibernateUtil.java:18)
... 2 more
我已经尝试了很多选项并寻找在线资源,hibernate文档但是找不到这里缺少的东西。任何帮助表示赞赏。
答案 0 :(得分:37)
最终能够解决问题,问题在于SessionFactory
的创建方式。
首先,官方文档是第一个去的地方,我必须说Hibernate官方文档似乎没有更新最新版本。
修复是将配置设置应用于StandardServiceRegistryBuilder
实例。
// Create the SessionFactory from hibernate.cfg.xml
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
请参阅我的博文here了解更多详情。
答案 1 :(得分:17)
我曾遇到过完全相同的问题,结果发现问题是我没有在本地启动数据库服务(我发现你也在使用本地数据库)。 那很简单!!!
答案 2 :(得分:1)
删除设置方言的两行,Hibernate 4根据您提供的JDBC驱动程序以及它连接的数据库确定要使用哪种方言。您不需要指定方言。如果强制使用不正确的方言或与驱动程序不匹配的方言(这可能会发生,因为方言比JDBC驱动程序更频繁地更新)Hibernate可能无法按预期执行。
使用hibernate.cfg.xml配置Hibernate是使用Hibernate时的工作方式3. Hibernate 4支持Spring Application上下文中的XML配置。 (我假设你正在使用Spring)它非常顺利地挂钩。我建议您切换到使用配置Hibernate的新方法,因为您为Hibernate 3设置了配置文档类型。
这是您希望使用Spring应用程序上下文为Hibernate 4指定dataSource的方法。
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/Test" />
<property name="username" value="username" />
<property name="password" value="password" />
</bean>
然后将它连接到会话工厂,如下所示:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="package.where.your.annotated.objects.are" />
<property name="hibernateProperties">
<props>
<!-- Uncomment this when testing -->
<!--<prop key="hibernate.show_sql">true</prop>-->
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
答案 3 :(得分:1)
我运行mysql服务时出现同样的问题,正确的凭据,但数据库名称拼写错误,所以基本上数据库不存在。
答案 4 :(得分:1)
使用以下内容时遇到此问题:
我在数据库端启用SSL
作为基于主机的身份验证机制的一部分(使用Postgres),问题是我没有指定与密钥相关的SSL
JVM属性启动应用程序时包含客户端应用程序证书的商店:
-Djavax.net.ssl.keyStore = mykeystore.jks -Djavax.net.ssl.keyStorePassword = MYPASSWORD
注意:我知道答案已经得到解答,但我将留下这个答案以供将来参考。
答案 5 :(得分:0)
这没关系
Configuration cfg = new Configuration().configure();
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build();
SessionFactory sf = cfg.buildSessionFactory(serviceRegistry);
Session session = sf.openSession();
答案 6 :(得分:0)
从hibernate源代码here,StandardServiceRegistryBuilder实例用于从hibernate.cfg.xml获取不同的服务,例如serviceRegistry.getService( JdbcServices.class )
,serviceRegistry.getService( CacheImplementor.class )
。
旧的configuration.buildSessionFactory()
方法现在如下:
public SessionFactory buildSessionFactory() throws HibernateException {
Environment.verifyProperties( properties );
ConfigurationHelper.resolvePlaceHolders( properties );
final ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings( properties )
.build();
setSessionFactoryObserver(
new SessionFactoryObserver() {
@Override
public void sessionFactoryCreated(SessionFactory factory) {
}
@Override
public void sessionFactoryClosed(SessionFactory factory) {
( (StandardServiceRegistryImpl) serviceRegistry ).destroy();
}
}
);
return buildSessionFactory( serviceRegistry );
}
答案 7 :(得分:0)
你也可以通过这种方式创建sesisonFactory来解决问题。
def idList = ClassA.createCriteria().list() { projections { distinct("id") property("name") } createAlias("firstsList", "fl", JoinType.LEFT_OUTER_JOIN) createAlias("SecondsList", "sl", JoinType.LEFT_OUTER_JOIN) or { eq("fl.login", "John") eq("sl.login", "John") } order("name", "desc") }
答案 8 :(得分:0)
在我的情况下,我运行了两次配置例程。 我在一个方法中进行了自动配置(即从资源中的xml配置),然后通过在另一个方法中设置属性来实现配置,但我忘记绕过前者。我一做到这一点,就错了。
答案 9 :(得分:0)
我遇到了完全相同的问题,问题是,我的计算机没有输入postgres数据库的pg_hba.conf中,该数据库允许允许哪些客户端(IP-Adresses)与数据库对话
答案 10 :(得分:0)
在我将连接字符串从远程地址更改为localhost后,我使用了错误的用户名和密码。希望这会有所帮助。
答案 11 :(得分:0)
// Create Configuration File and configure it.
Configuration configuration=new Configuration();
configuration.configure("com/sathya/config/emp.cfg.xml");
// Create Service Registry
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
// Create Session Object using SessionFactory Interface
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session=sessionFactory.openSession();
// new StandardServiceRegistryBuilder().applySettings(new Configuration().getProperties());
// Session session=new Configuration().buildSessionFactory(new StandardServiceRegistryBuilder().build()).openSession();