1

以下にリストされているコードのように構成を使用しています。auto create/drop 関数の継ぎ目が正常に機能しない (データベースにテーブルを作成/維持しない (dataSource.setConnectionProperties(hibernateProperties());))

(DBにすでにテーブルが作成されている場合に動作しますか?ここではプロパティは考慮されていないと思いますか?)、

設定

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

2 に答える 2

3

休止状態のプロパティをデータソースの接続プロパティとして渡しています。代わりに、sessionfactory に渡す必要があります。

@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 の親クラス) を参照してください。

于 2012-06-08T12:53:05.417 に答える
0

ここで最初に目にする問題は、Springに自動配線を許可するのではなく、新しいHibernateConfigを明示的に作成していることです。したがって、テストクラスに次のプロパティを追加します。

@Autowire
private SessionFactory sessionFactory;

深く見ると、少し混乱しているように見える奇妙な方法でそれを行っているので、SpringとIOCについて少し読みたいと思うかもしれません。あなたがやろうとしていることはすべて、実際にはすでにSpringに組み込まれているので、車輪の再発明をしているのです。つまり、Springのコンテキストから取得するのではなく、新しいインスタンスを作成しているので、物事をつなぎ合わせる方法があります。

ここでこれがどのように行われているのかを見てください(はい、他の問題がありますが、一般的なアイデアを得ることができるはずです):SpringTransactionJUnitテストでHibernateセッションを自動配線する適切な方法

于 2012-06-08T12:19:08.283 に答える