2012-06-08 2 views
1

Я использую конфигурацию, как в приведенном ниже коде. шлейфы функции автоматического создания/отбрасывания не должны работать должным образом (он не создает/не поддерживает таблицы в базе данных (dataSource.setConnectionProperties (hibernateProperties());))spring 3.1.0 Release Hibernate 4.1.2 Final - настройка базы данных с помощью аннотации, как установить свойства

(Он работает, когда таблица уже создана в DB? Я думаю, что свойства не принимаются во внимание здесь?),

Config

package com.parisibw.persistance; 

import java.util.Properties; 

import javax.sql.DataSource; 

import org.hibernate.SessionFactory; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.hibernate4.HibernateTransactionManager; 
import org.springframework.orm.hibernate4.LocalSessionFactoryBuilder; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import com.parisibw.forms.Contact; 

@Configuration 
@EnableTransactionManagement 
public class HibernateConfig { 


    @Bean 
    public SessionFactory sessionFactory() { 
    return new LocalSessionFactoryBuilder(datasource()).addAnnotatedClasses(Account.class, Contact.class).buildSessionFactory(); 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 
     return new HibernateTransactionManager(sessionFactory()); 
    } 

    @Bean 
    public Properties hibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); 
     properties.put("hibernate.show_sql", "true");  
     properties.put("hibernate.hbm2ddl.auto", "create"); 

     //properties.put("hibernate.connection.driver_class", "org.h2.Driver"); 
     //properties.put("hibernate.connection.url", "jdbc:h2:db/test;CIPHER=AES"); 
     //properties.put("hibernate.connection.username", "root"); 
     //properties.put("hibernate.connection.password", "root root"); 
     //properties.put("hibernate.connection.pool_size", "1");   
     //properties.put("hibernate.format_sql", "true"); 
     //properties.put("hibernate.use_sql_comments", "true"); 
     //properties.put("hibernate.c3p0.min_size", "5"); 
     //properties.put("hibernate.c3p0.max_size", "20"); 
     //properties.put("hibernate.c3p0.timeout", "300"); 
     //properties.put("hibernate.c3p0.max_statements", "50"); 
     //properties.put("hibernate.c3p0.idle_test_period", "3000"); 
     //properties.put("hibernate.cache.use_second_level_cache", "true"); 
     //properties.put("hibernate.cache.region.factory_class", 
     //"org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"); 
     //properties.put("hibernate.cache.use_query_cache", "true"); 
     //properties.put("hibernate.cache.use_minimal_puts", "true"); 
     //properties.put("hibernate.max_fetch_depth", "10");   

     return properties; 
    } 

    @Bean 
    public DataSource datasource() { 
     final DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
      dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
      dataSource.setUrl("jdbc:mysql://dbpath"); 
      dataSource.setUsername("username"); 
      dataSource.setPassword("password"); 
      dataSource.setConnectionProperties(hibernateProperties()); 
      return dataSource; 
    } 

} 

Счет

@Entity @Table(name="T_ACCOUNT") 
public class Account { 

    @Id 
    private long id; 
    @Column 
    private double cashBalance; 
    @Column 
    private String name; 

    public long getId() { 
      return id; 
    } 
    public void setId(long id) { 
      this.id = id; 
    } 
    public double getCashBalance() { 
      return cashBalance; 
    } 
    public void setCashBalance(double cashBalance) { 
     this.cashBalance = cashBalance; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "id: " + id + ", balance: " + cashBalance + ", name: " + name; 

    } 

тест класс

@RequestMapping(value = "/test", method = RequestMethod.GET) 
public String homeTest(Model model) { 
    Account account = new Account(); 

    try{  
     sessionFactory = new HibernateConfig().sessionFactory(); 
    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    //account.setId(2); 
    account.setName("Marcin"); 
    account.setCashBalance(1200); 
    session.save(account); 
    session.getTransaction().commit(); 
    session.close(); 

    }catch (Exception e) { 
     logger.info(e.toString()); 
    } 

    model.addAttribute("serverTime"); 
    return "test"; 
} 

ответ

3

Вы передавая свои свойства Hibernate в качестве свойств соединений для источник данных. Вместо этого они должны быть переданы сессии.

@Bean 
public SessionFactory sessionFactory() { 
return new LocalSessionFactoryBuilder(datasource()) 
    .addAnnotatedClasses(Account.class, Contact.class) 
    .addProperties(hibernateProperties()) 
    .buildSessionFactory(); 
} 

См http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/cfg/Configuration.html?is-external=true (родительский класс для LocalSessionFactoryBuilder)

+0

'buildSessionFactory()' устарел с использованием 'addProperties()'. Будет ли проблема с использованием устаревшего метода? – TheKojuEffect

+0

@ TheKojuEffect no; пока он все еще там, он должен работать. Это просто означает, что вы должны перейти к альтернативе, так как она будет удалена в некоторой будущей версии. Обычно устаревшая аннотация упоминает альтернативу, которая будет использоваться. –

+0

Вы знакомы с любыми альтернативами или способом использования 'buildSessionFactory (ServiceRegistry serviceRegistry)' – TheKojuEffect

0

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

@Autowire 
private SessionFactory sessionFactory; 

Глядя глубже, это выглядит, как вы можете прочитать немного о весне и МОК, потому что вы своего рода делаете это как-то странно, что выглядит, как вы может быть немного запутанным. Все, что вы пытаетесь сделать, на самом деле уже создано в Spring, поэтому вы изобретаете колесо. Короче говоря, вы создаете новые экземпляры вещей вместо того, чтобы получать их из контекста весны, поэтому теперь у вас есть способ объединить вещи для вас.

Взгляните на то, как это делается здесь (да есть и другие проблемы, но вы должны быть в состоянии получить общее представление): Proper way to autowire a Hibernate Session in a Spring Transaction JUnit test

+0

выше конфигурационный файл, где я настроить все свои свойства Hibernate (я не использую XML файлы или файлы свойств для настройки Hibernate). –

+4

@Mainguy Он использует класс конфигурации компонента. Это относительно новый способ использования Spring без xml. В этом нет ничего странного. –

Смежные вопросы