<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Cooky - study blog

    Java, Grails, OpenSolaris, Linux, programming, skateboarding...

    Spring + Hibernate 簡(jiǎn)單應(yīng)用

        Spring + Hibernate 是用 POJO 實(shí)現(xiàn)JavaEE 輕量級(jí)架構(gòu)在數(shù)據(jù)持久層和業(yè)務(wù)層使用的主流模式. POJO 是指 Plain Old Java Object,即"普通Java對(duì)象". 輕量級(jí)架構(gòu)可以這樣理解, 它使用了諸如Spring,Hibernate,iBATIS等輕量級(jí)框架來(lái)開(kāi)發(fā)企業(yè)級(jí)應(yīng)用, 相對(duì)于傳統(tǒng)的EJB(2.0及以前)重量級(jí)架構(gòu), 輕量級(jí)架構(gòu)實(shí)現(xiàn)更容易,而且"無(wú)侵入",或者說(shuō)沒(méi)有侵略性,即使用輕量級(jí)框架時(shí)非常方便,并可以自由地選擇使用其全部或部分功能,另外也很容易在原有框架的基礎(chǔ)上進(jìn)行擴(kuò)展. 關(guān)于使用POJO 輕量級(jí)架構(gòu)的詳細(xì)信息請(qǐng)參閱<<POJOs IN ACTION>>一書(shū). 此書(shū)中文版翻譯得也不錯(cuò), 鏈接地址為:
    http://www.china-pub.com/computers/common/info.asp?id=34697.
        這里我舉一個(gè)簡(jiǎn)單的Spring + Hibernate 的示例, 我是用MyEclipse開(kāi)發(fā)的, 而且使用了Spring對(duì)Hibernate封裝后的API來(lái)間接操作數(shù)據(jù)庫(kù).關(guān)于Spring 和 Hibernate, 以下兩本書(shū)很適合入門(mén)時(shí)閱讀:
    精通Hibernate:Java對(duì)象持久化技術(shù)詳解 http://www.china-pub.com/computers/common/info.asp?id=24485(這本書(shū)講得不是最新的3.x版本的,但影響不大)
    Spring 2.0核心技術(shù)與最佳實(shí)踐 http://www.china-pub.com/computers/common/info.asp?id=34820
        由于我使用的是英文版的Eclipse, 我按照做的步驟依序記下了簡(jiǎn)單的英文表示,如下所示: (英文可能不太規(guī)范,就當(dāng)偽代碼來(lái)讀哈~~ )
    Step in English
    1 New->Web Project:
        Project Name: HSpring
        J2EE Specification Level: Java EE 5.0
    Finish

    2 New->Class:
        Package: test.hspring.model
        Name: User

    3 pragram codes in the class User:
    package test.hspring.model;
    public class User
    {
        private long id;
        private String name;
        private String password;
        private boolean sex;

        public User()
        {
        }
    }

    then press Alt+Shift+S->Generate Getters and Setters...->select all
    then change the "public" modifier of setId(long id) to "private"
    notice that the getter method of boolean-sex filed is isSex() (getSex() is also valid)

    4 right-click on the project HSpring,then select MyEclipse->Add Hibernate Capabilities...
    ensure u select the Hibernate 3.1 Core Libaries and Copy checked Libary Jars to project folder and add to build-path(/WebRoot/WEB-INF/lib)
    then Hibernate config file:New; default settings:src,hibernate.cfg.xml
    Specify database connection details:unchecked(config it later)
    Create sessionFactory class:no

    5 Open the hibernate.cfg.xml file with Configuration View
    check the option Use JDBC Driver
    fill the URL with:   jdbc:mysql://localhost:3306/HSDB
    copy the mysqldriver.jar to WebRoot/WEB-INF/lib
    fill the Driver with: com.mysql.jdbc.Driver(u need first copy the mysql-connector.jar to WebRoot/WEB-INF/lib)
    fill the Username with: root
    fill the Password with ur password, admin eg.
    select Dialect: MySQL

    6 New->XML(Basic Templates) : User.hbm.xml under the package(folder) test.hspring.model,same with User class
    u can find the <!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    content in the Hibernate3.jar(Referenced Libraries/hibernate3.jar/org.hibernate.hibernate-mapping-3.0.dtd) if u forgot it

    7 edit the file hibernate.cfg.xml, Mappings->Add...->src/test/hspring/model/User.hbm.xml

    8 right-click on the project HSpring,then select MyEclipse->Add Spring Capabilities...
    Spring version: Spring 2
    check MyEclipse Libraries
    select Spring 2.0 AOP Libraries, Spring 2.0 Core Libraries, Spring 2.0 Persistence Core Libraries
    also Copy checked Library contents to project folder..(/WebRoot/WEB-INF/lib)
    check Specify new or existing Spring bean configuration file-> New
    Next
    check Creat Spring LocalSessionFactory that references the hibernate config using a configLocation property: LocalSessionFactory Bean Id: sessionFactory

    9 New->Interface->package: test.hspring.dao   name: UserDAO

    10 New->Class->UserDAOImpl extends HibernateDaoSupport implements UserDAO, package: test.hspring.dao
    notice the methods in this class: this.getHibernateTemplate.get(long id), save(class,long id), update(Object), find(String)...

    11 New->Class->test.hspring.RunThisOnce

    start your MySQL service, open your MySQL client and create a database named HSDB

    right-click in the code of RunThisOnce.java and select Run As->Java Application
    after the class running successfully, delete the "hbm2ddl.auto" property in the filehibernate.cfg.xml
    then you can find the table USERS has been create automantically, and it has a record "cooky"

       
        整個(gè)項(xiàng)目工程的下載鏈接為: http://m.tkk7.com/Files/cooky/HSpring.rar.
        注意,由于上傳文件大小有限制,我刪除了用到的所有第三方開(kāi)發(fā)包(jar),如果你想直接運(yùn)行此項(xiàng)目則需先將使用到的jar包c(diǎn)opy到HSpring/WebRoot/WEB-INF/lib 文件夾下. 另外你可以跟著我上面的英文步驟和下面的詳細(xì)介紹在MyEclipse自動(dòng)導(dǎo)入包.
        jar包的列表如下,如果提示缺少某些jar,可參考下圖進(jìn)行導(dǎo)入:



        整個(gè)項(xiàng)目工程的包視圖(Package Explorer)如下:



        下面我對(duì)前面的英文步驟做一些說(shuō)明,你可以跟著下面的步驟來(lái)做,同時(shí)參加前面的英文信息.
        1.新建一個(gè)網(wǎng)站項(xiàng)目, 名字為 HSpring, 選擇 Java EE 5.0 版本.

        2.新建一個(gè)類(lèi)User, 作為我們的實(shí)體bean(這里是指POJO,不是EJB里的實(shí)體bean). 指定包名為 test.hspring.model (此處為方便間接創(chuàng)建包,其實(shí)應(yīng)該先設(shè)計(jì)包結(jié)構(gòu)再建類(lèi))

        3.在User.java 編碼, 先寫(xiě)四個(gè)屬性:id,name,password,sex 和默認(rèn)構(gòu)造函數(shù).bean 的定義包含默認(rèn)構(gòu)造函數(shù)和屬性的getter,setter方法,所以下面添加這四個(gè)屬性的訪問(wèn)方法.直接按快捷鍵Alt+Shift+S 選Generate Getters and Setters...然后選擇全部屬性(為它們生成方法).此快捷鍵建議記住.你也可以右擊代碼然后選擇Source->Generate Getters and Setters....
        另外注意,我們將讓數(shù)據(jù)庫(kù)自動(dòng)生動(dòng)主鍵,即以自動(dòng)增長(zhǎng)的方式實(shí)現(xiàn)代理主鍵(代理主鍵指主鍵不包含邏輯含義).所以把setId()方法設(shè)為private以防止用戶(hù)修改id.還有,對(duì)于boolean型的屬性如sex, isSex() 和 getSex() 都可以作為此屬性的getter方法.
        User.java 的源代碼如下:
    User.javapackage test.hspring.model;

    /**
     * Model Bean - class
     *
     * @author cooky
     *
     */
    public class User
    {
        private long id;
        private String name;
        private String password;
        private boolean sex;

        /**
         * Default Constructor
         */
        public User()
        {
        }

        public long getId()
        {
            return id;
        }

        private void setId(long id)
        {
            this.id = id;
        }

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            this.name = name;
        }

        public String getPassword()
        {
            return password;
        }

        public void setPassword(String password)
        {
            this.password = password;
        }

        /**
         * Return the sex of the user.
         *
         * @return true: female; false: male
         */
        public boolean isSex()
        {
            return sex;
        }

        /**
         * Set the sex of the user.
         *
         * @return true: female; false: male
         */
        public void setSex(boolean sex)
        {
            this.sex = sex;
        }
    }

        4.現(xiàn)在我們要加入Hibernate的內(nèi)容.右擊項(xiàng)目名HSpring,選擇MyEclipse->Add Hibernate Capabilities...,選擇3.1版本的核心包,并選擇"copy checked..."選項(xiàng)以把用到的Hibernate jar包c(diǎn)opy到HSpring/WebRoot/WEB-INF/lib文件夾下,這樣你的項(xiàng)目移動(dòng)時(shí)依然可用,不會(huì)因?yàn)閎uild-path的不一致而需要重新導(dǎo)入包(如果你只是自己演示用,可以選擇只加入build-path).
        下一步中選擇生成新的hibernate.cfg.xml文件,位于src文件夾下.這是使用Hibernate時(shí)默認(rèn)指定的配置文件.然后選擇數(shù)據(jù)庫(kù)連接,如果你已經(jīng)在MyEclipse配置過(guò)你的數(shù)據(jù)庫(kù)(這里我用的是MySQL 5.0),則可以選擇配置好的數(shù)據(jù)庫(kù)連接.否則的話可以取消此項(xiàng)的勾選,稍后在文件中手動(dòng)配置. 下面一步是問(wèn)你是否自動(dòng)生成一個(gè)用于訪問(wèn)Hibernate API的sessionFactory類(lèi).由于這里我會(huì)用到Spring包裝后的API,所以不選中此項(xiàng).

        5.第4步中的xml文件生成后,以配置視圖打開(kāi)該文件(默認(rèn)情況下已經(jīng)這樣打開(kāi)了).現(xiàn)在先在這個(gè)文件中配置數(shù)據(jù)庫(kù)連接.選擇使用JDBC驅(qū)動(dòng),在URL項(xiàng)填jdbc:mysql://localhost:3306/HSDB,當(dāng)然端口(3306)和數(shù)據(jù)庫(kù)名(HSDB)你可以根據(jù)自己的情況自行指定.由于我們后面會(huì)在此數(shù)據(jù)庫(kù)中新建USERS表,所以確?,F(xiàn)在這個(gè)數(shù)據(jù)庫(kù)中沒(méi)有此表(不區(qū)分大小寫(xiě)).否則將會(huì)覆蓋此表造成數(shù)據(jù)丟失.(當(dāng)然你也可以在下面的步驟里重新指定表的名稱(chēng)而不用USERS,稍后會(huì)講到)
        現(xiàn)在要指定數(shù)據(jù)庫(kù)連接用到的驅(qū)動(dòng)類(lèi),在這之前,先把MySQL的連接驅(qū)動(dòng)包c(diǎn)opy到lib文件夾下(你可以到MySQL官方下載,名稱(chēng)類(lèi)似mysql-connector-java-5.0.5-bin.jar).然后指定驅(qū)動(dòng)類(lèi)為com.mysql.jdbc.Driver. 接著設(shè)置用戶(hù)名(默認(rèn)主用戶(hù)為root)和密碼(比如我的MySQL訪問(wèn)密碼是admin).最后選擇數(shù)據(jù)庫(kù)方言為MySQL.
        可能的hibernate.cfg.xml類(lèi)似:
    hibernate.cfg.xml
    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration>

    <session-factory>
        <property name="connection.url">
            jdbc:mysql://localhost:3306/HSDB
        </property>
        <property name="myeclipse.connection.profile">
            JDBC for MySql
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password">admin</property>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">create</propety>
        <mapping resource="test/hspring/model/User.hbm.xml" />
    </session-factory>

    </hibernate-configuration>
        注意,里面最后設(shè)置的<mapping />指向第6步中生成的配置文件,此文件用來(lái)定義如果把User類(lèi)映射到數(shù)據(jù)庫(kù)表.另外,我額外添加了三個(gè)屬性:show_sql一般在調(diào)試時(shí)使用,即在控制臺(tái)顯示程序執(zhí)行的sql語(yǔ)句;format_sql用來(lái)格式化前面的sql語(yǔ)句,否則每條(比如插入)語(yǔ)句都占一行很不直觀;最后的hbm2ddl.auto屬性設(shè)為create,用來(lái)配置由數(shù)據(jù)庫(kù)映射文件(如第6步中生成的文件User.hbm.xml)生成數(shù)據(jù)庫(kù)表的定義(ddl),并且執(zhí)行此ddl(即創(chuàng)建表的sql語(yǔ)句)來(lái)自動(dòng)生成表,這樣就不用手動(dòng)在數(shù)據(jù)庫(kù)創(chuàng)建表了.由此更可見(jiàn)Hibernate強(qiáng)大的ORM(Object Relational Mapping,對(duì)象關(guān)系映射)能力.hbm2ddl是基于ant運(yùn)行的開(kāi)放工具,由于MyEclipse集成了ant,運(yùn)用更方便.但使用ant也是J2EE 開(kāi)發(fā)人員必備的能力之一.
        自動(dòng)生成數(shù)據(jù)庫(kù)表可作為測(cè)試用,但我在這里是專(zhuān)門(mén)用它來(lái)生成表,此表以后就可以使用了,不是為了測(cè)試.所以執(zhí)行一次程序并生成了表后,就要把這個(gè)屬性刪除,否則每次執(zhí)行都會(huì)重新建表并覆蓋原來(lái)的表了.下面還會(huì)詳講.

        6.現(xiàn)在我們就可以新建配置文件,來(lái)為User類(lèi)指定如何映射到數(shù)據(jù)庫(kù).在test.hspring.model包(或稱(chēng)文件夾)下新建xml文件User.hbm.xml(你也可以建在其他地方).文件的文件頭<!DOCTYPE>定義了此xml文件的語(yǔ)法,如果你忘記了文件頭的格式,可以去你添加的hibernate3.jar包里找位于最后的兩個(gè)dtd文件,分別是cfg.xml和 hbm.xml兩種hibernate配置文件的語(yǔ)法格式,注釋內(nèi)容中有文件頭示例(或參照下面的代碼).
        User.hbm.xml文件內(nèi)容如下:
    User.hbm.xml<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="test.hspring.model.User" table="USERS">
            <id name="id" column="ID">
                <generator class="native"></generator>
            </id>
            <property name="name" column="NAME" length="20" not-null="true" />
            <property name="password" column="PASSWORD" length="30"
                not-null="true" />
            <property name="sex" column="SEX" />
        </class>
    </hibernate-mapping>
        文件中的一個(gè)<class>標(biāo)簽將對(duì)應(yīng)一個(gè)實(shí)體bean類(lèi),這里只有一個(gè):User. <class>標(biāo)簽的name屬性指定要映射的實(shí)體bean類(lèi); table屬性指定要映射的表名,不設(shè)置此屬性的話將默認(rèn)采取類(lèi)的名稱(chēng)(如User).類(lèi)的屬性用<property>子標(biāo)簽來(lái)說(shuō)明,但用來(lái)映射主鍵的屬性(如id)要用用專(zhuān)門(mén)的<id>標(biāo)簽標(biāo)識(shí).<property>的name屬性和實(shí)體bean類(lèi)里的屬性對(duì)應(yīng)(名稱(chēng)相同); column屬性指定此屬性將映射到表中的哪一列(字段),不設(shè)的話默認(rèn)和name相同.另外<property>還有not-null,length屬性等,都是故名思義.<id>有個(gè)子屬性:<generator>,用來(lái)指定主鍵的生成方式,為auto_increment時(shí)表示采用Hibernate自己實(shí)現(xiàn)的增長(zhǎng)機(jī)制,為native時(shí)表示將采用底層數(shù)據(jù)庫(kù)自己的實(shí)現(xiàn)機(jī)制,所以移植性更好.關(guān)于映射的更多信息請(qǐng)參閱Hibernate的相關(guān)內(nèi)容.
       
        7.現(xiàn)在要把寫(xiě)好的User.hbm.xml加入hibernate.cfg.xml中.在配置視圖下打開(kāi)hibernate.cfg.xml,點(diǎn)Mappings區(qū)域的Add...,找到User.hbm.xml并選擇.第5步中的hibernate.cfg.xml內(nèi)容已經(jīng)實(shí)現(xiàn)加入了User.hbm.xml.

        8.Hibernate的配置告一段落,現(xiàn)在來(lái)進(jìn)行和Spring相關(guān)的操作.右擊項(xiàng)目名選擇MyEclipse->Add Spring Capabilities...,在出來(lái)的對(duì)話框中,選擇Spring版本為:Spring 2.0,勾選 MyEclipse Libraries 選項(xiàng),在列出的jar包里,選擇 Spring 2.0 AOP Libraries, Spring 2.0 Core Libraries, Spring 2.0 Persistence Core Libraries,同樣選中最下面的選項(xiàng)把包c(diǎn)opy進(jìn)項(xiàng)目(或者只加入build-path).然后選擇新建Spring bean 配置文件.下面可以按照默認(rèn)選項(xiàng),來(lái)生成一個(gè)引用已有的Hibernate配置文件的sessionFactory來(lái)供Spring使用.

        9.下面我們來(lái)實(shí)現(xiàn)DAO(Data Access Object,數(shù)據(jù)訪問(wèn)對(duì)象)的操作.由于Spring鼓勵(lì)面向接口編程,所以雖然我們的項(xiàng)目很簡(jiǎn)單,還是使用了接口.新建接口(Interface) UserDAO, 位于test.hspring.dao 包下.此接口定義了通過(guò)Hibernate訪問(wèn)數(shù)據(jù)庫(kù)的一系列操作,用來(lái)為服務(wù)(Service)提供方法,而面向表現(xiàn)層的服務(wù)是不能直接調(diào)用Hibernate(或Srping)的API來(lái)實(shí)現(xiàn)這些方法的.以下是其源碼:
    UserDAO.javapackage test.hspring.dao;
    import java.util.List;
    import test.hspring.model.User;
    /**
     * Data Access Object interface
     *
     * @author cooky
     *
     */
    public interface UserDAO
    {
        User getUserByID(long id);
        User getUserByName(String name);
        List<User> listAllUsers();
        void changePassword(User user, String password);
        void addUser(User user);
    }

       
        10.現(xiàn)在編寫(xiě)實(shí)現(xiàn)了以上接口的類(lèi)(如 UserDAOImpl).在這里我把這個(gè)類(lèi)擴(kuò)展(繼承)了Spring包里的HibernateDAOSupport類(lèi),這樣可以加入Spring提供的事務(wù)管理,并通過(guò)Spring封裝了Hibernate API后的方法來(lái)間接進(jìn)行數(shù)據(jù)庫(kù)操作(對(duì)類(lèi)的對(duì)象進(jìn)行操作,Hibernate將操作映射到數(shù)據(jù)庫(kù)).這些方法常用的有HibernateTemplate.get(long id), save(class,long id), update(Object), find(String),load()等等.HibernateTemplate對(duì)象可由父類(lèi)中提供的this.getHibernateTemplate()方法得到.以下是UserDAOImpl類(lèi)的源代碼:
    UserDAOImpl.javapackage test.hspring.dao;
    import java.util.Iterator;
    import java.util.List;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
    import test.hspring.model.User;
    /**
     * An implementation of UserDAO using Spring's API which resue the API of
     * hibernate3
     *
     * @author cooky
     *
     */
    public class UserDAOImpl extends HibernateDaoSupport implements UserDAO
    {
        @Override
        public void addUser(User user)
        {
            this.getHibernateTemplate().save(user);
        }

        @Override
        public void changePassword(User user, String password)
        {
            User userToChange = this.getUserByID(user.getId());
            userToChange.setPassword(password);
            this.getHibernateTemplate().update(userToChange);
        }

        @Override
        public User getUserByID(long id)
        {
            User user = (User) this.getHibernateTemplate().get(User.class, id);
            return user;
        }

        @Override
        public User getUserByName(String name)
        {
            User user = null;
            List userList = this.getHibernateTemplate().find("from User u where u.name=?", name);
            if (!userList.isEmpty())
            {
                Iterator userItr = userList.iterator();
                user = (User) userItr.next();
            }
            return user;
        }

        @Override
        public List<User> listAllUsers()
        {
            List<User> userList = this.getHibernateTemplate().find("from User");
            if (userList == null || userList.isEmpty())
            {
                return null;
            } else
            {
                return userList;
            }
        }
    }


        11.現(xiàn)在,Hibernate+Spring的內(nèi)容基本完成,就缺少和表現(xiàn)層交互的內(nèi)容了.不過(guò),前面提過(guò)要運(yùn)行一次程序以自動(dòng)生成數(shù)據(jù)庫(kù)表,所以這里我提供了一個(gè)類(lèi):RunThisOnce,位于test.hspring包.它把一個(gè)User對(duì)象保存對(duì)數(shù)據(jù)庫(kù).源碼如下:
    RunTestOncepackage test.hspring;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import test.hspring.dao.UserDAO;
    import test.hspring.model.User;
    /**
     * Run this class once to generate the tables that to be mapped by hibernate(we
     * only generate one table: USERS). After you run this, delete the
     * "hbm2ddl.auto" property in the file hibernate.cfg.xml
     *
     * @author cooky
     *
     */
    public class RunThisOnce
    {
        public static void main(String[] args)
        {
            UserDAO userDAO = (UserDAO) new ClassPathXmlApplicationContext("applicationContext.xml").getBean("userDAO");
            User user = new User();
            user.setName("cooky");
            user.setPassword("test-password");
            user.setSex(false);
            userDAO.addUser(user);
        }
    }

        在運(yùn)行之前,要在applicationContext.xml文件中配置要使用的bean: userDAO.這里我們用Spring事務(wù)及AOP(Aspect Oriented Programming,面向切面編程)機(jī)制來(lái)管理bean.配置后的applicationContext.xml內(nèi)容如下:
    applicationContext.xml<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="configLocation"
                value="classpath:hibernate.cfg.xml">
            </property>
        </bean>

        <bean id="transactionManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>

        <bean id="userDAOTarget" class="test.hspring.dao.UserDAOImpl">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>

        <bean id="userDAO"
             class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="target" ref="userDAOTarget"></property>
            <property name="transactionManager" ref="transactionManager"></property>
            <property name="proxyTargetClass" value="true"></property>
            <property name="transactionAttributes">
                <props>
                    <prop key="*">PROPAGATION_REQUIRED</prop>
                </props>
            </property>
        </bean>
    </beans>
        bean 的proxyTargetClass屬性設(shè)為true,是因?yàn)榈玫絙ean里可能會(huì)拋出ClassCastException,這樣就需要指明此bean為代理bean.其他配置一目了然,userDAO這個(gè)代理bean用target屬性指明實(shí)際代理的類(lèi).關(guān)于此處配置的詳細(xì)信息(如設(shè)置方法中事務(wù)的傳播機(jī)制等),請(qǐng)參閱Spring 相關(guān)內(nèi)容.
        運(yùn)行RunThisOnce之前,你還需要開(kāi)啟MySQL服務(wù),并創(chuàng)建在hibernate.cfg.xml中指定的數(shù)據(jù)庫(kù)(如HSDB).但USERS表不用創(chuàng)建.現(xiàn)在,在RunThisOnce.java的代碼中右擊,選擇 Run As->Java Application, 運(yùn)行成功后會(huì)在數(shù)據(jù)庫(kù)生成USERS表,而且里面有一條記錄(name為"cooky").
        正如前面所說(shuō),我運(yùn)行此程序只為了自動(dòng)生成數(shù)據(jù)庫(kù),所以,現(xiàn)在去hibernate.cfg.xml把<property name="hbm2ddl.auto">create</property>刪除,以防止程序每次運(yùn)行都重新建立表.而且RunThisOnce.java也應(yīng)該刪除.如果現(xiàn)在再次運(yùn)行此程序你只會(huì)向表中添加name,password和sex都相同的一條新記錄(之前沒(méi)有設(shè)這三個(gè)之中的任一個(gè)的unique為true,即允許重復(fù)).

        Okay...終于寫(xiě)完了~~
        那么,表現(xiàn)層(如網(wǎng)頁(yè)瀏覽器)怎么和現(xiàn)在的Spring+Hibernate框架進(jìn)行交互呢(即實(shí)現(xiàn)服務(wù)/Service)? 你可能想到在Servlet中像RunThisOnce.java中那樣得到applicationContext.xml配置的bean,并調(diào)用dao的方法.但是,這樣是極不規(guī)范的.Spring配置的bean不能隨便獲取.我會(huì)再寫(xiě)一篇關(guān)于JSF與Spring結(jié)合的文章來(lái)簡(jiǎn)單探討這個(gè)問(wèn)題.
        另外,我還會(huì)寫(xiě)一篇關(guān)于JUnit單元測(cè)試的文章,也會(huì)用到現(xiàn)在的這個(gè)項(xiàng)目HSpring.



    Keep It Simple, Stupid

    posted on 2007-10-15 23:47 Cooky 閱讀(1751) 評(píng)論(12)  編輯  收藏 所屬分類(lèi): Java

    評(píng)論

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用[未登錄](méi) 2007-10-16 11:37 chance

    嚴(yán)重頂一下
    我已加入收藏  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用 2007-10-17 12:47 Micky

    Hello,Cooky!  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用 2007-10-18 00:16 cooky

    @Micky
    Hello u guy  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用 2007-10-18 01:59 Micky

    cooky真強(qiáng)~
    鞠躬,握手~
    罪過(guò)啊罪過(guò),一開(kāi)始我還以為這文章是轉(zhuǎn)載的……  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用 2007-10-18 02:03 Micky

    blogjava也挺強(qiáng),我剛發(fā)現(xiàn)原來(lái)這里的評(píng)論是ajax實(shí)現(xiàn)的異步刷新……
    好意外~~
    這么老土古舊的博客模板了。真是模板不可貌相。。。  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用 2007-10-19 00:35 cooky

    @Micky
    對(duì)你真是無(wú)語(yǔ)了...  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用 2008-03-23 19:44 強(qiáng)

    不錯(cuò),牛寫(xiě)得這么清楚  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用[未登錄](méi) 2008-04-11 17:54 ling

    正在學(xué),感謝哦,很詳細(xì)啊!嘿嘿,樓主以后多發(fā)一些哦!  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用 2008-11-12 10:26 ddd

    henhao!  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用 2008-12-03 13:02 marshall

    試一下AJAX更新..  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用 2008-12-03 13:02 marshall

    哈哈,,再來(lái)一次,  回復(fù)  更多評(píng)論   

    # re: Spring + Hibernate 簡(jiǎn)單應(yīng)用 2008-12-23 21:57 xc

    試一下,哈哈  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 亚洲国产精品日韩| 一级**爱片免费视频| 亚洲国产精品自在线一区二区| 国产色爽女小说免费看| 日本视频一区在线观看免费| 亚洲阿v天堂在线2017免费 | 99re热精品视频国产免费| 黄色a三级免费看| 一本色道久久88—综合亚洲精品| 亚洲激情在线观看| 亚洲女初尝黑人巨高清| 五月婷婷亚洲综合| 国产美女无遮挡免费网站| 国内外成人免费视频| 国产男女爽爽爽爽爽免费视频| 国产白丝无码免费视频| 最好免费观看高清在线| 9久热精品免费观看视频| 一级毛片正片免费视频手机看| 国产亚洲情侣久久精品| 亚洲av永久无码| 亚洲av无码专区首页| 亚洲影院天堂中文av色| 色老板亚洲视频免在线观| 亚洲1234区乱码| 天堂亚洲国产中文在线| 亚洲中文字幕无码中文字| 456亚洲人成在线播放网站| 一本色道久久综合亚洲精品蜜桃冫 | 7777久久亚洲中文字幕蜜桃| 久久精品国产亚洲| 在线免费观看亚洲| 亚洲欧洲中文日产| 亚洲av无码专区在线| 亚洲娇小性xxxx| 亚洲欧好州第一的日产suv| 亚洲综合小说另类图片动图| 亚洲色欲色欱wwW在线| 亚洲欧洲日产国码久在线| 毛片亚洲AV无码精品国产午夜| 免费一级毛片在线播放视频免费观看永久|