Hibernate 3 dengan Spring

1. Gambaran keseluruhan

Artikel ini akan menumpukan pada penyediaan Hibernate 3 dengan Spring - kami akan melihat bagaimana menggunakan konfigurasi XML dan Java untuk mengatur Spring dengan Hibernate 3 dan MySQL.

Kemas kini: artikel ini difokuskan pada Hibernate 3. Sekiranya anda mencari versi Hibernate terkini - ini adalah artikel yang difokuskan kepadanya.

2. Konfigurasi Musim Semi Java untuk Hibernate 3

Menyiapkan Hibernate 3 dengan konfigurasi Spring dan Java sangat mudah:

import java.util.Properties; import javax.sql.DataSource; import org.apache.tomcat.dbcp.dbcp.BasicDataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; import org.springframework.orm.hibernate3.HibernateTransactionManager; import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.google.common.base.Preconditions; @Configuration @EnableTransactionManagement @PropertySource({ "classpath:persistence-mysql.properties" }) @ComponentScan({ "com.baeldung.spring.persistence" }) public class PersistenceConfig { @Autowired private Environment env; @Bean public AnnotationSessionFactoryBean sessionFactory() { AnnotationSessionFactoryBean sessionFactory = new AnnotationSessionFactoryBean(); sessionFactory.setDataSource(restDataSource()); sessionFactory.setPackagesToScan(new String[] { "com.baeldung.spring.persistence.model" }); sessionFactory.setHibernateProperties(hibernateProperties()); return sessionFactory; } @Bean public DataSource restDataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); dataSource.setUrl(env.getProperty("jdbc.url")); dataSource.setUsername(env.getProperty("jdbc.user")); dataSource.setPassword(env.getProperty("jdbc.pass")); return dataSource; } @Bean @Autowired public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { HibernateTransactionManager txManager = new HibernateTransactionManager(); txManager.setSessionFactory(sessionFactory); return txManager; } @Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { return new PersistenceExceptionTranslationPostProcessor(); } Properties hibernateProperties() { return new Properties() { { setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); } }; } }

Berbanding dengan Konfigurasi XML - dijelaskan seterusnya - terdapat perbezaan kecil dalam cara sebiji kacang dalam konfigurasi mengakses yang lain. Dalam XML tidak ada perbezaan antara menunjuk kacang atau menunjuk kilang kacang yang mampu membuat kacang itu . Oleh kerana konfigurasi Java selamat untuk jenis - menunjuk terus ke kilang kacang tidak lagi menjadi pilihan - kita perlu mengambil kacang dari kilang kacang secara manual:

txManager.setSessionFactory(sessionFactory().getObject());

3. Konfigurasi Musim Semi XML untuk Hibernate 3

Begitu juga, kita boleh mengatur Hibernate 3 dengan konfigurasi XML juga:

      ${hibernate.hbm2ddl.auto} ${hibernate.dialect}             

Kemudian, fail XML ini dimasukkan ke dalam konteks Spring menggunakan kelas @Configuration :

@Configuration @EnableTransactionManagement @ImportResource({ "classpath:persistenceConfig.xml" }) public class PersistenceXmlConfig { // }

Untuk kedua-dua jenis konfigurasi, sifat khusus JDBC dan Hibernate disimpan dalam fail sifat:

# jdbc.X jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate_dev?createDatabaseIfNotExist=true jdbc.user=tutorialuser jdbc.pass=tutorialmy5ql # hibernate.X hibernate.dialect=org.hibernate.dialect.MySQL5Dialect hibernate.show_sql=false hibernate.hbm2ddl.auto=create-drop

4. Spring, Hibernate dan MySQL

Contoh di atas menggunakan MySQL 5 sebagai pangkalan data asas yang dikonfigurasi dengan Hibernate - namun, Hibernate menyokong beberapa Pangkalan Data SQL yang mendasari.

4.1. Pemandu itu

Nama kelas Pemandu akan dikonfigurasikan melalui yang jdbc.driverClassName harta diberikan kepada sumber data.

Dalam contoh di atas, ia ditetapkan ke com.mysql.jdbc. Pemacu dari ketergantungan mysql-connector-java yang kami tentukan dalam pom, pada permulaan artikel.

4.2. Dialek

Dialek ini dikonfigurasikan melalui yang hibernate.dialect harta diberikan kepada Hibernate SessionFactory .

Dalam contoh di atas, ini ditetapkan ke org.hibernate.dialect.MySQL5Dialect kerana kami menggunakan MySQL 5 sebagai Pangkalan Data yang mendasari. Terdapat beberapa dialek lain yang menyokong MySQL :

  • org.hibernate.dialect.MySQL5InnoDBDialect - untuk MySQL 5.x dengan enjin simpanan InnoDB
  • org.hibernate.dialect.MySQLDialect - untuk MySQL sebelum 5.x
  • org.hibernate.dialect.MySQLInnoDBDialect - untuk MySQL sebelum 5.x dengan enjin penyimpanan InnoDB
  • org.hibernate.dialect.MySQLMyISAMDialect - untuk semua versi MySQL dengan enjin penyimpanan ISAM

Hibernate menyokong SQL Dialect untuk setiap Pangkalan Data yang disokong.

5. Penggunaan

Pada ketika ini, Hibernate 3 dikonfigurasikan sepenuhnya dengan Spring dan kami dapat menyuntik Hibernate SessionFactory mentah secara langsung setiap kali kami perlu:

public abstract class FooHibernateDAO{ @Autowired SessionFactory sessionFactory; ... protected Session getCurrentSession(){ return sessionFactory.getCurrentSession(); } }

6. Maven

Untuk menambahkan pergantungan Spring Persistence ke pom, sila lihat contoh Spring with Maven - kita perlu menentukan konteks spring dan spring-orm .

Melanjutkan Hibernate 3, kebergantungan Maven mudah:

 org.hibernate hibernate-core 3.6.10.Final 

Kemudian, untuk membolehkan Hibernate menggunakan model proksi, kami juga memerlukan javassist :

 org.javassist javassist 3.18.2-GA 

Kami akan menggunakan MySQL sebagai DB kami untuk tutorial ini, jadi kami juga memerlukan:

 mysql mysql-connector-java 5.1.32 runtime 

Dan akhirnya, kita tidak akan menggunakan pelaksanaan sumber data Spring - DriverManagerDataSource ; sebaliknya, kami akan menggunakan penyelesaian kumpulan sambungan siap pengeluaran - Tomcat JDBC Connection Pool:

 org.apache.tomcat tomcat-dbcp 7.0.55 

7. Kesimpulannya

Dalam contoh ini, kami mengkonfigurasi Hibernate 3 dengan Spring - keduanya dengan konfigurasi Java dan XML. Pelaksanaan projek sederhana ini boleh didapati di projek GitHub - ini adalah projek berasaskan Maven, jadi mudah diimport dan dijalankan sebagaimana adanya.