2016-07-04 4 views
1

Я настроил свойства hibernate в файле application.properties моего приложения загрузки весны.application.properties vs hibernate.cfg.xml в приложении весенней загрузки

application.properties

#hibernate config 
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect 
spring.datasource.url=<db_url> 
spring.datasource.username=<username> 
spring.datasource.password=<password> 
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver 
# Show or not log for each sql query 
spring.jpa.show-sql = true 
# Naming strategy 
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy  

# ThymeLeaf 
spring.thymeleaf.cache= false 
spring.thymeleaf.mode=LEGACYHTML5 

я получаю ошибку, когда я пытаюсь получить сессию

Configuration configuration = new Configuration(); 
configuration.configure("application.properties"); 
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); 
SessionFactory sessionFactory = configuration.buildSessionFactory(ssrb.build()); 
Session session = sessionFactory.openSession(); 

ОШИБКА:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.hibernate.HibernateException: 
Could not parse configuration: application.properties] with root cause 

org.dom4j.DocumentException: Error on line 1 of document : Content is not allowed in prolog. Nested exception: Content is not allowed in prolog. 

Я думаю, что его ждет hibernate.cfg.xml файл в пути класса?

Есть ли способ использовать только application.properties или мне нужно переместить все свойства, связанные с спящим режимом, на hibernate.cfg.xml или hibernate.properties файл?

getSelectedStudents

public List getSelectedStudents(){ 
    final EntityManagerFactory emf = null; 
    EntityManager em = emf.createEntityManager(); 

    Query q = em.createNativeQuery("SELECT s.student_id, s.first_name, s.last_name, s.city FROM Student s " 
            + "where s.city=:city and s.last_name = :lname", Student.class); 
    q.setParameter("city", "London"); 
    q.setParameter("lname", "Rizwan"); 

    List<Student> students = q.getResultList(); 

    for (Student s : students) { 
     System.out.println("Student " 
       + s.getFirstName() 
       + " " 
       + s.getLastName()); 
    } 

    return students; 
} 

Ошибка 2:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause 

java.lang.NullPointerException: null 
    at com.school.service.StudentServiceImplementation.getSelectedStudents(StudentServiceImplementation.java:69) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_77] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_77] 

EDIT: как предложено использовать Entity менеджер, я добавил метод getSelectedStudents. Я все еще получаю ошибку на EntityManager em = emf.createEntityManager(); см. Ошибка 2 для деталей.

+0

Прочитав документацию и не пытайтесь использовать спящий режим для получения сеанса. Также, если вы используете Spring Boot, зачем использовать 'SessionFactory' ... Вместо этого используйте' EntityManger'. Spring Boot предварительно сконфигурировал материал JPA для вас, если только вам не нужны некоторые функции спящего режима, начиная с JPA. –

+0

@M.Deinum, я использую 'EntityManager', но получаю ошибку (ошибка 2), пожалуйста, см. Обновление. – Muhammad

+0

Нет, вы не ... Вы используете 'null'. Я настоятельно рекомендую прочитать документацию о структуре, которую вы пытаетесь использовать ... В основном единственное, что вам нужно сделать, это объявить поле типа 'EntityManager' в вашем классе, поместить там' @ PersistenceContext' и сделанный. –

ответ

0

Если вы используете весеннюю ботинок в тандеме с пружиной-автоконфигурацией, вы можете просто отбросить библиотеки Hibernate на ваш путь к классам, и пружина автоматически подключит Hibernate для вас. Все, что вам нужно сделать, это предоставить некоторые параметры конфигурации spring jpa в файле application.properties, и все готово.

Если вы хотите, чтобы избежать использования пружинного AUTOCONFIGURE, то вам нужно добавить класс конфигурации, который строит LocalContainerEntityManagerFactoryBean, а JpaTransactionManager и ваш DataSource.

В любом случае, чтобы использовать JPA в вашем приложении, вам просто нужно добавить аннотированный свойство вашего хранилища или службы классов, чтобы получить экземпляр вашей EntityManager следующим образом:

@PersistentContext 
private EntityManager entityManager; 

Spring удостоверится чтобы ввести это для вас, и ваш код просто должен использовать его по мере необходимости.

+0

Более подробная информация по этой теме Я нашел здесь: http: // blog.netgloo.com/2014/10/06/spring-boot-data-access-with-jpa-hibernate-and-mysql/ – Astrowie

0

Пример. в классе конфигурации вам понадобится вызвать @PropertySources и объявить окружение var.

import java.util.Properties; 

    import javax.sql.DataSource; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.context.annotation.Bean; 
    import org.springframework.context.annotation.Configuration; 
    import org.springframework.context.annotation.PropertySource; 
    import org.springframework.context.annotation.PropertySources; 
    import org.springframework.core.env.Environment; 
    import org.springframework.orm.hibernate4.LocalSessionFactoryBean; 
    import org.springframework.jndi.JndiTemplate; 

    @Configuration 
    @PropertySources(value = {@PropertySource("classpath:application.properties") }) 
    public class DataBaseConfig { 

     @Autowired 
     private Environment environment; 

     @Bean(name = "dataSource") 
     public DataSource dataSource() { 
      .......... 
      return dataSource; 
     } 



     @Bean 
     public LocalSessionFactoryBean getSessionFactory() { 
      LocalSessionFactoryBean asfb = new LocalSessionFactoryBean(); 
      asfb.setDataSource(dataSource()); 
      asfb.setHibernateProperties(getHibernateProperties()); 
      asfb.setPackagesToScan(new String[] { "your package domain class" }); 
      return asfb; 
     } 



     Properties getHibernateProperties() { 
      Properties properties = new Properties(); 
      properties.put("schema", environment.getProperty("JNDI.SCHEMA")); 
      properties.put("hibernate.dialect", environment.getProperty("HIBERNATE.DIALECT.PGSQL")); 
      properties.put("hibernate.show_sql", environment.getProperty("HIBERNATE.SQL.SHOW")); 
      properties.put("hibernate.format_sql", environment.getProperty("HIBERNATE.SQL.FORMAT")); 
      properties.put("hibernate.hbm2ddl.auto", environment.getProperty("HIBERNATE.HBM2DDL.AUTO")); 
      properties.put("hibernate.default_schema", environment.getProperty("JNDI.SCHEMA")); 
      properties.put("hibernate.use_sql_comments", environment.getProperty("HIBERNATE.SQL.COMMENTS")); 
      properties.put("hibernate.connection.CharSet", environment.getProperty("HIBERNATE.CHARSET")); 
      properties.put("hibernate.generate_statistics", environment.getProperty("HIBERNATE.STATISTICS")); 
      properties.put("hibernate.connection.autocommit", environment.getProperty("HIBERNATE.AUTOCOMMIT")); 
      properties.put("hibernate.connection.useUnicode", environment.getProperty("HIBERNATE.UNICODE")); 
      properties.put("hibernate.enable_lazy_load_no_trans", environment.getProperty("HIBERNATE.ENABLED.LAZY")); 
      properties.put("hibernate.connection.characterEncoding", environment.getProperty("HIBERNATE.ENCODING")); 
      return properties; 

     } 


    } 

И у вас в файле "application.properties" есть это.

 ################ CONFIGURACION HIBERNATE ################ 
     HIBERNATE.SEARCH.DEFAULT.PROVIDER=hibernate.search.default.directory_provider 
     HIBERNATE.DIALECT.MYSQL=org.hibernate.dialect.MySQL5InnoDBDialect 
     HIBERNATE.DIALECT.MSSQL=org.hibernate.dialect.SQLServerDialect 
     HIBERNATE.DIALECT.PGSQL=org.hibernate.dialect.PostgreSQLDialect 
     HIBERNATE.CACHE.SECONDLEVEL=false 
     HIBERNATE.CACHE.QUERYCACHE=false 
     HIBERNATE.ENABLED.LAZY=hibernate.enable_lazy_load_no_trans 
     HIBERNATE.HBM2DDL.AUTO=none 
     HIBERNATE.SQL.COMMENTS=false 
     HIBERNATE.SQL.FORMAT=false 
     HIBERNATE.STATISTICS=false 
     HIBERNATE.AUTOCOMMIT=true 
     HIBERNATE.SQL.SHOW=true 
     HIBERNATE.ENCODING=utf8 
     HIBERNATE.CHARSET=utf8 
     HIBERNATE.UNICODE=true 
Смежные вопросы