2019年10月12日 星期六

Spring串聯Hibernate

原先以Hibernate建立好Java專案,
因為有導入Spring的需求,所以要改成Spring框架,怎麼做呢?


  1. 建立 Maven Web Project DataSource SQLServer 連線
    # 檔案位置: webapp > META-INF > context.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
        <Resource
            name="jdbc/servdb" type="javax.sql.DataSource"  //name自己取名
            auth="Container" username="sa" password="passw0rd"
            driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
            url="jdbc:sqlserver://localhost:1433;databaseName=servdb">
        </Resource>
    </Context>
  2. 建立 Maven Web Project web.xml resource-ref
    # 檔案位置: webapp > WEB-INF > web.xml
    <resource-ref>
        <description>JNDI DataSource </description>
        <res-ref-name>jdbc/servdb</res-ref-name>  //要跟name一樣
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
  3. Maven pom.xml 需要加入 spring-webmvc/spring-tx/spring-jdbc/spring-orm 四個dependency
    # 檔案位置: pom.xml
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>  //使用網頁一定要引入spring-webmvc
        <version>5.2.0.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>      //為了能使用<tx:annotation-driven/>
        <version>5.2.0.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>    //為了連動資料庫
        <version>5.2.0.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>     //為了能使<property name="packagesToScan">取代既有的hibernate.cfg.xml
        <version>5.2.0.RELEASE</version>
    </dependency>
  4. 建立 Maven Web Project web.xml ContextLoaderListener
    # 檔案位置: webapp > WEB-INF > web.xml
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    # Bean 元件組態檔如設檔名為 applicationContext.xml (預設)則可以省略 <context-parm></context-parm>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
  5. 建立 Spring 所支援的 DataSource
    # 檔案位置: webapp > WEB-INF > applicationContext.xml# 此為需掃瞄的 Annotation 設定
    <context:component-scan base-package="model"/>  //有@Repository標籤的檔案位在哪裡
    
    # Spring 提供 JndiObjectFactoryBean 工廠建立 dataSource 物件供開發者建立連線
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:/comp/env/jdbc/servdb"/>  //jdbc/servdb
    
    </bean>
  6. 建立 hibernate.cfg.xml 基本設定
    # 檔案位置: src > main > java > Hibernate.cfg.xml
    <property name="hibernate.show_sql">true</property>  //console顯示sql語法
    <property name="hibernate.format_sql">true</property>  //console顯示排列後之sql語法
  7. 建立 Spring 所支援的 SessionFactory
    # 檔案位置: webapp > WEB-INF > applicationContext.xml# 此為需掃瞄的 Annotation 設定
    <context:component-scan base-package="model"/>
    
    <bean id="dataSource"
        class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:/comp/env/jdbc/servdb"/>
    </bean>                 //此行以上在步驟5講過
    
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="model"/>  //spring-orm
        <property name="configLocation" value="classpath:applicationContext.xml"/></bean>
    
    <bean id="transactionManager" //可透過@Transactional將方法交給Spring控管,成功自動commit,失敗自動rollback
        class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/> 
    </bean>
    
    <tx:annotation-driven/>  //spring-tx,@Transactional必搭才生效
以上,感謝大神陳嘉仁提供教學(原檔在github),整理後發佈。

沒有留言:

張貼留言

無暇的程式碼(Clean code)金句

The only valid measurement of code quality: WTFs/minute.