※XML設定
pom.xml
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.13.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.13.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.13.RELEASE</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.10.Final</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.19.0-GA</version> </dependency>
※雖然不用hibernate.cfg.xml,但jar檔當然還是要,而hibernate-core會用到javassist,所以也要下載
※如果不喜歡用DBCP,可以用C3P0,可參考Spring 管理 JdbcTemplate、DBCP、C3P0、JdbcDaoSupport (Spring3.x 二十三)的最後一項
applicationContext.xml
<context:annotation-config /> <context:component-scan base-package="dao.impl" /> <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" /> <property name="username" value="username" /> <property name="password" value="password" /> </bean> <bean id="sf" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="ds" /> <property name="mappingResources"> <list> <value>hbm/Dept.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.use_sql_comments">true</prop> </props> </property> </bean> <bean id="ht" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sf" /> </bean>
※可以從這裡複製,然後再修改,比較不會錯,最後的bean沒得複製,這行是因為Spring有提供一個叫HibernateTemplate的東西,相當於Hibernate的org.hibernate.Session
※props也可用如下的寫法:
<value> hibernate.dialect=org.hibernate.dialect.OracleDialect hibernate.show_sql=true hibernate.format_sql=true hibernate.use_sql_comments=true </value>
IDept.java
public interface IDept { public boolean insert(Dept dept); public List<Dept> QueryAll(); }
DeptImpl.java
@Repository public class DeptImpl extends HibernateDaoSupport implements IDept { @Autowired public DeptImpl(HibernateTemplate ht) { super.setHibernateTemplate(ht); } // 不用HibernateTemplate @Autowired private SessionFactory sf; @Override public boolean insert(Dept dept) { return super.getHibernateTemplate().save(dept) != null; } @SuppressWarnings("unchecked") @Override public List<Dept> QueryAll() { // 不用HibernateTemplate Session session = sf.openSession(); Query q = session.createQuery("from Dept"); return q.list(); // return super.getHibernateTemplate().find("from Dept"); } }
測試類
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); for (String s : ctx.getBeanDefinitionNames()) { System.out.println(s); } IDept dao = ctx.getBean("deptImpl", IDept.class); Dept vo = new Dept(); vo.setDname("業務部"); vo.setLoc("舊金山"); System.out.println(dao.insert(vo)); for (Dept d : dao.QueryAll()) { System.out.println(d.getDname()); } ((ClassPathXmlApplicationContext) ctx).close();
※此次專案圖
※Annotation設定
可參考API,package是org.springframework.orm.hibernate3.annotation,裡面只有一隻class,叫AnnotationSessionFactoryBean將XML設定的applicationContext.xml的sf改成以下的樣子,注意class不同了
applicationContext.xml
<bean id="sf" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="ds" /> <property name="annotatedClasses"> <list> <value>vo.Dept</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.use_sql_comments">true</prop> </props> </property> </bean>
※屬性名稱annotatedClasses下面放class就搞定了
Dept.java
@Entity @Table public class Dept { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXX") @SequenceGenerator(name = "XXX", sequenceName = "DEPT_SEQ") private Integer deptno; private String dname; private String loc; // setter/getter... }
※getCurrentSession
如果想使用CurrentSession還要設定
applicationContext.xml
<tx:annotation-driven transaction-manager="txManagerHibernate" /> <bean id="txManagerHibernate" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sf" /> </bean> <bean id="txManagerJDBC" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="ds" /> </bean> <!-- LocalSessionFactoryBean的hibernateProperties,這兩個prop不用設定 --> <prop key="hibernate.current_session_context_class"> org.springframework.orm.hibernate3.SpringSessionContext </prop> <prop key="hibernate.transaction.factory_class"> org.springframework.orm.hibernate3.SpringTransactionFactory org.hibernate.transaction.JTATransactionFactory </prop>
※txManagerHibernate和txManagerJDBC擇其一,其實還有JTA,看官網
※hibernate.current_session_context_class要設就設這個,執行LocalSessionFactoryBean時,裡面其實就會幫我們加了(底層的589行),但整合就不能使用thread了
※hibernate.transaction.factory_class,執行LocalSessionFactoryBean就會幫我們判斷加其中之一了,不要設定
DeptImpl.java
@Transactional public boolean insert(Dept dept) { Session session = sf.getCurrentSession(); Dept dept1 = new Dept(); dept1.setDeptno(160); dept1.setDname("業務部"); dept1.setLoc("舊金山"); session.save(dept); session.save(dept1); return true; } @Transactional(readOnly = true) public List<Dept> QueryAll() { //... }
※applicationContext.xml設定完了還不夠,還得在方法上加@Transactional,這樣子不用顯式的呼叫commit、rollback,就可以自動幫我們完成commit、rollback了
※雖然是select,還是要加@transactional,不然一樣會報錯;加上readOnly = true效能會比較好
※還可以applicationContext.xml和hibernate.cfg.xml都並存,還有針對特定的方法名執行transaction,看Hibernate4.x 整合 Spring3.x
沒有留言:
張貼留言