2015-12-15 5 views
2

Im получить нулевое значение для sessionFactory переменной в этой строке:Hibernate 5: SessionFactory является нулевым

sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory(); 

Это целый класс:

import javax.imageio.spi.ServiceRegistry; 
import javax.transaction.Transaction; 

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; 

import ch.makery.model.Employee; 

public class HelloWorld { 
    protected void setUp() throws Exception { 
    } 

    public static void main(String[] args) { 

     SessionFactory sessionFactory = null; 

     // A SessionFactory is set up once for an application! 
     final StandardServiceRegistry registry = new StandardServiceRegistryBuilder() 
       .configure() // configures settings from hibernate.cfg.xml 
       .build(); 
     try { 
      sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory(); 
     } 
     catch (Exception e) { 
      // The registry would be destroyed by the SessionFactory, but we had trouble building the SessionFactory 
      // so destroy it manually. 
      StandardServiceRegistryBuilder.destroy(registry); 
     } 

     Session session = sessionFactory.openSession(); 
     //employee = new Employee(); 

     session.beginTransaction(); 
     session.save(new Employee()); 
     session.getTransaction().commit(); 
     session.close(); 
    } 
} 

Это мои связанные Hibernate файлы:

<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.password">manolete</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/employee</property> 
     <property name="hibernate.connection.username">root</property> 
     <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> 
     <property name="hbm2ddl.auto">create</property> 
     <mapping resource="src/ch/makery/model/Employee.hbm.xml" /> 
    </session-factory> 
</hibernate-configuration> 
<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 14-dic-2015 21:00:04 by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="ch.makery.model.Employee" table="EMPLOYEE"> 
     <id name="id" type="int"> 
      <column name="ID" /> 
      <generator class="assigned" /> 
     </id> 
     <property name="firstName" type="java.lang.String"> 
      <column name="FIRSTNAME" /> 
     </property> 
     <property name="lastName" type="java.lang.String"> 
      <column name="LASTNAME" /> 
     </property> 
    </class> 
</hibernate-mapping> 
package ch.makery.model; 

public class Employee { 
    private int id; 
    private String firstName,lastName; 

    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

} 

Im не использует Spring, так как я просто создаю настольное приложение.

ответ

0

Способ buildSessionFactory - deprecated с версии hibernate 4 и заменен новым API. Если вы используете спящий режим 4.3.0 и выше пытаются написать конфигурацию, как это:

Configuration configuration = new Configuration().configure(); 
configuration.configure("your_path_hibernate_.cfg.xml"); 
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); 
sessionFactory = configuration.buildSessionFactory(ssrb.build()); 
+0

но быстрый старт говорит 'buildSessionFactory()' это не рекомендуется: http://docs.jboss.org/hibernate/orm/5.0/quickstart/html/ – ziiweb

+0

@ziiweb смотреть на это [ link] (https://github.com/hibernate/hibernate-orm/blob/master/hibernate-testing/src/main/java/org/hibernate/testing/junit4/BaseCoreFunctionalTestCase.java) – Abdelhak

1

Когда я обновил свой Hibernate код от v4.1.8 до v5.0.6 У меня тоже была проблема с моим SessionFactory экземпляр является ноль. Распечатав трассировку стека, я смог выяснить, что мне нужно включить в мой путь сборки необязательные банки c3p0.

My Первое предложение должно было бы распечатать трассировку стека непосредственно из вашего блока catch. След станет хорошей отправной точкой на пути к разрешению. Так что ваш catch блок будет выглядеть следующим образом:

catch (Exception e) { 
     // The registry would be destroyed by the SessionFactory, but we had trouble building the SessionFactory 
     // so destroy it manually. 
     StandardServiceRegistryBuilder.destroy(registry); 
     e.printStackTrace(); 
    } 

Однако я заметил, что вы не имеете hibernate.dialect свойства, определенные в файле конфигурации. Хотя это свойство необязательно, Hibernate User Guide отмечает, что спящий режим «по какой-то причине» не может определить, какой диалект вы используете. Мое второе предложение было бы определить ваш диалект базы данных непосредственно в вашем файле конфигурации с настройкой hibernate.dialect.

Поскольку исходный файл конфигурация после предполагает, что вы делаете использование диалекта базы данных MySQL, попробуйте добавить в этом диалекте узел свойств к сеансу фабричного узлу:

<property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

Если вы используете MySQL 5. х затем использовать

<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 

Убедитесь, что дополнительные c3p0 банки находятся в пути сборки.

Удачи!

0
private static SessionFactory sessionFactory = createSessionFactory(); 

private static SessionFactory createSessionFactory() { 
    if (sessionFactory == null) { 
     StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()     .configure("hibernate.cfg.xml").build(); 
     Metadata metaData = new MetadataSources(standardRegistry).getMetadataBuilder().build(); 
     sessionFactory = metaData.getSessionFactoryBuilder().build(); 
    } 
    return sessionFactory; 
} 

public static SessionFactory getSessionFactory() { 
    return sessionFactory; 
} 

public static void shutdown() { 
    sessionFactory.getCurrentSession().close(); 
} 
+0

Добро пожаловать в Stack Overflow! Хотя этот фрагмент кода может решить проблему, он не объясняет, почему и как он отвечает на вопрос. Пожалуйста, [укажите объяснение своего кода] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers), так как это действительно помогает улучшить качество вашего сообщения.Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. ** Флагеры/рецензенты: ** [Для ответов только на код, таких как этот, нисходящий, не удалять!] (// meta.stackoverflow.com/a/260413/2747593) –