spring 3.1.0 Release Hibernate 4.1.2 Final - Конфигурация базы данных с помощью аннотации, как установить свойства

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

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

Конфиг

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";
}

person Marcin Wasiluk    schedule 08.06.2012    source источник


Ответы (2)


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

@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)

person Joeri Hendrickx    schedule 08.06.2012
comment
buildSessionFactory() устарел с использованием addProperties(). Возникнут ли проблемы с использованием устаревшего метода? - person TheKojuEffect; 11.02.2013
comment
@TheKojuEffect нет; пока он все еще там, он должен работать. Это просто означает, что вам следует начать переходить к альтернативе, поскольку она будет удалена в какой-то будущей версии. Обычно в устаревшей аннотации упоминается альтернатива, которую следует использовать. - person Joeri Hendrickx; 11.02.2013
comment
Знакомы ли вы с какими-либо альтернативами или способами использования buildSessionFactory(ServiceRegistry serviceRegistry) - person TheKojuEffect; 12.02.2013
comment
@TheKojuEffect Я думаю, что главной альтернативой сейчас было бы вообще не использовать SessionFactory, а вместо этого использовать JPA EntityManager. - person Joeri Hendrickx; 12.02.2013
comment
Не могли бы вы объяснить причину этого поподробнее? Я новичок в разработке этого типа разработки, и недавно я изучил спящий режим, поэтому я пытаюсь придерживаться спящего режима. А как насчет JPA или EclipseLink? Почему их предпочитать? - person TheKojuEffect; 12.02.2013
comment
JPA - это стандартный способ Java для обеспечения постоянства. Hibernate - это его реализация; как и EclipseLink. Другими словами, если вы используете JPA, вы можете переключаться между спящим режимом и eclipselink в качестве реализации. См. stackoverflow.com/questions/ 9881611 / и вот неплохое подробное руководство: alexecollins.com/?q=content/tutorial-hibernate-jpa-part-1. В остальном Google - ваш друг. В этом разделе комментариев вряд ли стоит углубляться. - person Joeri Hendrickx; 12.02.2013

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

@Autowire
private SessionFactory sessionFactory;

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

Взгляните, как это делается здесь (да, у него есть другие проблемы, но вы сможете получить общее представление): Правильный способ автоматического подключения сеанса гибернации в тесте JUnit Spring Transaction

person Mainguy    schedule 08.06.2012
comment
В приведенном выше файле конфигурации я настраиваю все свои свойства Hibernate (я не использую файлы xml или файлы свойств для настройки Hibernate). - person Marcin Wasiluk; 08.06.2012
comment
@Mainguy Он использует класс конфигурации bean-компонента. Это относительно новый способ использования Spring без xml. В этом нет ничего странного. - person Joeri Hendrickx; 08.06.2012