??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV一区二区三区四区,亚洲图片中文字幕,亚洲天堂一区二区三区四区http://www.tkk7.com/balajinima/category/26950.htmlzh-cnFri, 29 Feb 2008 10:23:59 GMTFri, 29 Feb 2008 10:23:59 GMT60SSH?struts hibernate spring 各v什么作?http://www.tkk7.com/balajinima/articles/182937.html李云?/dc:creator>李云?/author>Fri, 29 Feb 2008 07:19:00 GMThttp://www.tkk7.com/balajinima/articles/182937.htmlhttp://www.tkk7.com/balajinima/comments/182937.htmlhttp://www.tkk7.com/balajinima/articles/182937.html#Feedback0http://www.tkk7.com/balajinima/comments/commentRss/182937.htmlhttp://www.tkk7.com/balajinima/services/trackbacks/182937.html 单的_

struts 控制用的

hibernate 操作数据库的

spring 用解耦的
详细的说Q?/span>

STRUTS ?/span> SSH 框架中v控制的作?/span> , 其核心是 Controller, ?/span> ActionServlet, ?/span> ActionServlet 的核心就?/span> Struts-confi g.xml. 主要控制逻辑关系的处?/span> .

hibernate 是数据持久化?/span> , 是一U新的对象、关pȝ映射工具 , 提供了从 Java cd数据表的映射Q也提供了数据查询和恢复{机?/span> , 大大减少数据讉K的复杂度。把Ҏ(gu)据库的直接操?/span> , 转换为对持久对象的操?/span> .

SPRING 是一个轻量的控制反?/span> (IoC) 和面向切?/span> (AOP) 的容器框?/span> , 面向接口的编E?/span> , 由容器控制程序之间的Q依赖)关系Q而非传统实现中,q序代码直接操控。这也就是所?/span> ?/span> 控制反{ ?/span> 的概忉|在:Q依赖)控制权由应用代码中{C外部容器Q控制权的{U,是所谓反转。依赖注入,即组件之间的依赖关系由容器在q行期决定,形象的来_即由容器动态的某U依赖关pL入到lg之中
起到的主要作用是解?/span>

Struts ?/span> spring ?/span> Hibernate 在各层的作用

1 Q?/span> struts 负责 web ?/span> .

ActionFormBean 接收|页中表单提交的数据Q然后通过 Action q行处理Q再 Forward 到对应的|页?/span>

?/span> struts-config.xml 中定?/span> <action-mapping>, ActionServlet 会加载?/span>

2 Q?/span> spring 负责业务层管理,?/span> Service Q或 Manager).

1 Q?/span> service ?/span> action 提供l计的调用接口,装持久层的 DAO.

2 Q可以写一些自q业务Ҏ(gu)?/span>

3 Q统一?/span> javabean 理Ҏ(gu)

4 Q声明式事务理

5. 集成 Hiberante

3 Q?/span> Hiberante Q负责持久化层,完成数据库的 crud 操作

hibernate 为持久层Q提?/span> OR/Mapping ?/span>

它有一l?/span> .hbm.xml 文g?/span> POJO, 是跟数据库中的表相对应的。然后定?/span> DAO Q这些是跟数据库打交道的c,它们会?/span> PO ?/span>

?/span> struts+spring+hibernate 的系l中Q?/span>

对象的调用流E是Q?/span> jsp-> Action Q?/span> > Service ->DAO ->Hibernate ?/span>

数据的流向是 ActionFormBean 接受用户的数据, Action 数据从 ActionFromBean 中取出,装?/span> VO ?/span> PO,

再调用业务层?/span> Bean c,完成各种业务处理后再 forward 。而业务层 Bean 收到q个 PO 对象之后Q会调用 DAO 接口Ҏ(gu)Q进行持久化操作?/span>

 



]]>
Hibernate上手指南 http://www.tkk7.com/balajinima/articles/146910.html李云?/dc:creator>李云?/author>Thu, 20 Sep 2007 12:17:00 GMThttp://www.tkk7.com/balajinima/articles/146910.htmlhttp://www.tkk7.com/balajinima/comments/146910.htmlhttp://www.tkk7.com/balajinima/articles/146910.html#Feedback1http://www.tkk7.com/balajinima/comments/commentRss/146910.htmlhttp://www.tkk7.com/balajinima/services/trackbacks/146910.html
关键?   Hibernate上手指南    

Hibernate上手
    
 HibernateQ很久以前我听说过q个名词Q但是似乎没什么动力让我去接近它,感觉它是一个很复杂的东西,一直没搞明白它到底是用来做什么的。直到接手了一个项目在技术选型的时候我再一ơ的看到了Hibernate。我试着M用它Q发现它q不是我惛_中的那么深奥Q它很易用。你q不需要了解它的内部结构,它一栯Z工作的很好,如果你理解了它到底能Z做什么的?br />本文着重讲qCZ么要使用HibernateQ此外也单的介绍了如何用HibernateQ以及Hibernate中的一些基本概c我惛_这文章来向还没有接触qHibernate的开发者推荐款优秀的开源ORM产品Q如果你已经实践qHibernateQ那么我想你没有必要再看下去?/font>

一、Why HibernateQ?br />      现在行“测试驱动开发”,怼的我觉得“目的驱动学?fn)”是一U比较好的接受新技术,新知识的途径。在学习(fn)一h的技术之前,首先得明到底有没有必要学习(fn)Q已有的技术是否已l工作的很好Q学?fn)这个新的技术是Z解决什么问题。如果你明确了以上问题,那么Lq学?fn)新的技术将会事半功倍,q且能快速应用到实际的开发当中来提高效益?br />要说HibernateQ就得先介绍一下Object/Relation MapperQORMQ,中文译为对象关pL。之所以会产生q样的概忉|源于目前软g开发中的一些不协调的思想。目前流行的~程模型是OOPQObject Oriented ProgrammingQ,面向对象的编E,而目前流行的数据库模型是Relational DatabaseQ这两者思考的方式不一Pq必然生了开发过E中的不协调。ORM框架Q也UCؓ持久层框ӞQ的出现是Z解决q样的问题,屏蔽底层数据库的操作Q以面向对象的方式提供给开发者操作数据库中数据的接口。目前流行的ORM框架有Apach OJBQHibernateQiBatis{等Q当然最完善Q最好用的是HibernateQ至我q样认ؓ。或怽对“持久层”感到迷惑,其实说白了很单,把数据放到数据库中叫做持久化Q内存种的数据当然不是持久的Q,那么负责q一操作的结构层面就叫做持久层。你以前应该听说q表现层Q业务层Q数据层Q那么持久层是在业务层和数据层之间的一层,或者说持久层是数据层的一部分?br />接下来,我想通过一个实际开发中的例子来说明ORM带给我们的好处。先来讲一下我们的需求,数据库中有三张表Q一张studentQ一张courseQ另外一张course_slection。其中student用来保存学生信息Qcourse用来表示评信息Qcourse_selection用来表示学生的选课信息。(表的详细l构q里我就省略了,因ؓqƈ不重要)现在要求~写一个程序,用来选出指定学号学生所选的评名字Q那么可能会出现以下几种E序~写的方式:
1.    菜鸟U?br />代码片段1Q?/font>


public List selectCourses(String studentId)
    {
        Connection con = null;
        Statement sta = null;
        try 
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection(
                             "jdbc:oracle:thin:@10.85.33.199:1521:glee",
                                                          "test", "test");
            String sql = "select * from course_selection";
            String sql2 = "select name from course where id='";
            sta = con.createStatement();
            ResultSet rs = sta.executeQuery(sql);
            List list = new LinkedList();
            while (rs.next()) 
            {
                ResultSet rs2 = sta.executeQuery(sql2 +                            
                                           rs.getString("course_id") + "'");
                if (rs2.next()) 
                {
                    list.add(rs2.getString("name"));
                }
            }
            return list;
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        return null;
}

q段E序你一定看的很晕吧Q什么ؕ七八p的都搞在一P那么接下来看一D|q过的程序?br />2.    改进后的代码
代码片段2Q?/font>


class DBHelper
{
    public static Connection getConnection()
    {
        try 
        {
            Class.forName(Constants.DB_DRIVER);
            return DriverManager.getConnection(Constants.DB_URL,  
                                           Constants.DB_USER, Constants.DB_PWD);
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        return null;
    }
}
public List selectCourses(String studentId)
    {
        Connection con = null;
        Statement sta = null;
        try 
        {
            con = DBHelper.getConnection();
            String sql = "select * from course_selection";
            String sql2 = "select name from course where id='";
            sta = con.createStatement();
            ResultSet rs = sta.executeQuery(sql);
            List list = new LinkedList();
            while (rs.next()) 
            {
                ResultSet rs2 = sta.executeQuery(sql2 +                                 rs.getString("course_id") + "'");
                if (rs2.next()) 
                {
                    list.add(rs2.getString("name"));
                }
            }
            return list;
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        return null;
}

q段代码的Ş式是一U被q泛采用的Ş式,相对W一D代码来_应该已经有所q步Q分M数据库连接操作,q把数据库连接信息交l单独的cd成(一般放在配|文仉面)Q往往在开发中q会引入数据库连接池QConnection PoolQ来提高性能Q我q里都尽量简化了。但q些q不能从Ҏ(gu)上改善程序的l构Q在业务代码中仍然؜杂了很多数据库操作,l构不清晰。下面来看一D彻底分L据库操作的代码:
3.    DAO模式
代码片段3Q?/font>


public List selectCourses(String studentId)
    {
        StudentDAO sd = new StudentDAO();
        Student student = sd.findById(studentId);
        Set set = student.getCourseSelections();
        List courseNames = new LinkedList();
        for (Iterator iter = set.iterator(); iter.hasNext();) 
        {
            CourseSelection element = (CourseSelection) iter.next();
            courseNames.add(element.getCourse().getName());
        }
    return courseNames;
}

       是不是感觉代码少了很多?或许你对q段代码有点qhQ没关系Q后文会详细解释。我惛_解释一下DAO。其实DAO和Hibernate没有必然联系Q只不过一般用Hibernate的程序都用DAO模式。DAO的全U是Data Access ObjectQ程序要讉K数据库中的数据(包括获取Q更斎ͼ删除Q都通过DAO来访问,实际上DAO才是真正屏蔽了所有数据库操作的东西,q样在业务代码中可以完全隔L据层的代码。如果我告诉你,在真正用Hibernate开发的时候,要完成上文提到的功能Q需要手写的代码是“代码片D?”这么多Q甚x,你是不是有很大的动力d?fn)HibernateQ那么好吧,让我们开始Hibernate之旅?


二、持久层的组?br />    q一节的名字应该换成“基于Hibernate的持久层的组成”更合适一点,可是它太长了。既然Hibernate是用来开发持久层Q那么我先介l一下这个持久层中的各个元素?br />1.    POJOQPlain Old Java ObjectQ你可以把它看作是简单的JavaBean。一般说来,一张数据库表对应一个POJOQ也是对象/关系的一一映射?br />2.    DAOQ对于每一个POJOQ一般都有一个DAO与之对应Q承担所有关于该POJO的访问控制。实际上也就是控制了Ҏ(gu)据库中一张表的访问控制?br />3.    *.hbm.xml文gQ这个文件定义了POJO和数据库中的表是如何映射的,比如POJO中的字段对应数据库表中的哪个字段{等。一般每个映都用单独的文g来描qͼ也就是有一个POJO有一?.hbm.xml文g?br />4.    *.cfg.xml文gQ这个文件定义了Hibernate的基本信息,比如数据库驱动,用户名,密码{等q接信息Q也包括了所有要用的*.hbm.xml文gQ在初始化的时候,Hibernate会读取这个文件来扄应的映射文g完成对象/关系?br />我们q是以上文的例子来详l描qC下这里提到的各个元素的内宏V?br />1.    Student.javaQ?br />代码片段4Q?/p>


 
public class Student  implements java.io.Serializable 
{
    private String id;
    private String name;
    private Set courseSelections = new HashSet(0);
 
    public Student() 
    {
    }
 
    public String getId() 
    {
        return this.id;
    }
    
    public void setId(String id) 
    {
        this.id = id;
    }
 
    public String getName() 
    {
        return this.name;
    }
    
    public void setName(String name) 
    {
        this.name = name;
    }
 
    public Set getCourseSelections() 
    {
        return this.courseSelections;
    }
    
    public void setCourseSelections(Set courseSelections) 
    {
        this.courseSelections = courseSelections;
    }
}

q个cd是一个POJOQ你可以很明昄看出来它?yu)是一个JavaBean。我惌释它的courseSelection字段。很昄Q在数据库表student中,没有q个字段。这里的q个字段是因Z个外键引用,course_selection的student_id是一个外键,引用了student表中的id字段。那么在StudentcMcourseSelection来记录这L(fng)外键关系Q也是_当我们获取了Student对象以后Q就可以直接获取他的选课记录Q这样就Z层的调用提供了很大的方便。这里有Ҏ(gu)p没关系Q我在介l映定义文Ӟ*.hbm.xmlQ的时候还会提到这个问题?br />2.    StudentDAO.java
代码片段5Q?/p>


 
public class StudentDAO 
{
    Session session;
    public StudentDAO()
    {
        Configuration cfg = new Configuration();
        cfg.configure("/hibernate.cfg.xml");
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        session = sessionFactory.openSession();
    }
    
    public void save(Student transientInstance) 
    {
        session.save(transientInstance);
    }
    
    public void delete(Student persistentInstance) 
    {
        session.delete(persistentInstance);
    }
    
    public Student findById(java.lang.String id) 
    {
        List list = session.createCriteria(Student.class).add(
Expression.eq("id", id)).list();
        if (list.size() > 0) 
        {
            return (Student)list.get(0);
        }
        return null;
    }
}

q里的构造函数是用来启动HibernateQƈ获取session。打开一个sessionq当于打开了一个数据库q接Q然后我们就可以对这个sessionq行操作Q完成数据库操作Q完全不用写SQL语句。我q里Hibernate的启动方式写的很不规范,pȝ应该只需要完成一ơHibernate启动可以在不同的DAO中用,我把它写在构造函数里面纯_Ҏ(gu)Z化演CZ码?br />你可以看到save和deleteҎ(gu)都很单直接对对象操作Q而findById有些麻烦,因ؓq里有一个查询过E在里面。Hibernate里面查询可以用Criteriaq个cL完成Q我们也常用Hibernate独有的HQLQHibernate Query LanguageQ来完成查询。当然Hibernate也是支持原生SQL的。关于查询的详细信息请参考其他文章或书籍Q我只是演示一个流E,介绍一些概c?br />3.    Student.hbm.xml
代码片段6Q?/p>


<hibernate-mapping>
    <class name="Student" table="STUDENT">
        <id name="id" type="string">
            <column name="ID" length="10" />
            <generator class="assigned" />
        </id>
        <property name="name" type="string">
            <column name="NAME" not-null="true" />
        </property>
        <set name="courseSelections" inverse="true">
            <key>
                <column name="STUDENT_ID" length="10" 
not-null="true" />
            </key>
            <one-to-many class="CourseSelection" />
        </set>
    </class>
</hibernate-mapping>   

q个文g定义了StudentcdStudent表是如何映射的。class元素定义了SudentcdSTUDENT表映,然后定义了各个属性是如何映射的。如果一个属性是数据库的keyQ那么会用id标签来定义,column定义了当前类的属性和数据库中的哪个字D对应,generator是idҎ(gu)的。一般来说id是自增的Q由于我的数据库是用的OracleQ它没有自增字段Q要实现自增必须用SequenceQ这出了本文的范围Q所以我qassigned来简化示例代码。assigned表示id是用L(fng)定的?br />有一个比较特别的标签是setQ它对应着数据库中的外键关p,上文我提到的通过Student对象可以获得所有相关的选课记录是通过q里的定义实现的。name属性对应了StudentcM的字D名Qkey表示哪个字段是外键,one-to-many表示Student和CourseSelection是一对多关系Q这和事实相W。类似的q有many-to-oneQmany-to-manyQ不q这些都不常用,我不介绍了。HibernateҎ(gu)q个映射定义文gQ在实例化一个POJOQ比如StudentQ的时候,会自动的把定义过映射的属性用数据库中的数据填充,set也包括在内?br />4.    hibernate.cfg.xml
代码片段7Q?/p>


<hibernate-configuration>
    <session-factory>
        <property name="connection.username">test</property>
        <property name="connection.url">
jdbc:oracle:thin:@10.85.33.199:1521:glee</property>
        <property name="dialect">
org.hibernate.dialect.Oracle9Dialect</property>
        <property name="connection.password">test</property>
        <property name="connection.driver_class">
oracle.jdbc.OracleDriver</property>
        <mapping resource="Student.hbm.xml"></mapping>
        <mapping resource="CourseSelection.hbm.xml"></mapping>
        <mapping resource="Course.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>    

q个文g我不解释了,自己看吧。结合上文StudentDAO的例子,我想你应该能看明白?br />看了q么多,或许你会有点头皮发麻QPOJOQDAOQ配|文?..好像要写的东西还是很多。值得庆幸的是现在Hibernate已经发展的比较成熟了Q有很多工具来帮助我们完成这些工作,比如MiddleGenQHibernate Synchronizer{等。我使用的开发工hEclipse+MyEclipseQ我所要做的只是把数据库表建好Q然后MyEclipse提供的工具会自动Ҏ(gu)数据库表生成POJOQDAOQ?.hbm.xmlQ甚至hibernate.cfg.xml都是自动完成的(前提是MyEclipse知道你的数据库连接信息)。我q不打算介绍如何用IDE来开发HibernateQ你可以参考IDE的帮助文档?br />到这里ؓ止,使用Hibernateq行开发的基本l成元素我都介绍好了Q强烈徏议你马上实践一遍,即有些不理解,也先依葫芦画瓢一个。对了,别忘了把Hibernate的包down下来攑ֈclasspath里面?/p>

三、Session与SessionFactory
Session可以说是Hibernate的核心,Hibernate对外暴露的接口就是Session。所以我q里讲一下有关Session的常用函数和Ҏ(gu)?br />在讲Session之前Q我惛_提一下SessionFactoryQ这个东西不复杂Q只要配|好p了。顾名思义QSessionFactory是用来创徏Session的。SessionFactory是线E安全的Q也是说对于同一个数据库的所有操作共享一个SessionFactoryp了。回头看代码片段5Q我们可以看到SessionFactory的常用配|方式?br />代码片段8Q?/p>


 
Configuration cfg = new Configuration();
cfg.configure("/hibernate.cfg.xml");
SessionFactory sessionFactory = cfg.buildSessionFactory();

我们通过Configuration来读取配|文Ӟ然后可以创建SessionFactoryQ这D代码在    所有系l中都大同小异,一般就是xml配置文g的名字不一P所以也没什么好说的?br />当我们有了SessionFactory以后可以获取Session了。调用SessionFactory.openSession()׃q回一个Session实例Q然后我们操作这个Session来访问数据库。值得一提的是Sessionq不是线E安全的Q也是每一个线E都必须有自qSession。所以我们一般通过以下Ҏ(gu)来获取和关闭SessionQ?br />代码片段9Q?/p>


 
public static Session currentSession() throws HibernateException 
    {
        Session session = (Session) threadLocal.get();
        if (session == null || !session.isOpen()) 
        {
            if (sessionFactory == null) 
            {
                try 
                {
                    cfg.configure(CONFIG_FILE_LOCATION);
                    sessionFactory = cfg.buildSessionFactory();
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }
            session = (sessionFactory != null) ?
                 sessionFactory.openSession(): null;
            threadLocal.set(session);
        }
        return session;
}
 
public static void closeSession() throws HibernateException 
    {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);
 
        if (session != null) 
        {
            session.close();
        }
}

可以看到Q我们通过threadLocal来保存每个线E的sessionQ这样就保证了各个线E之    间的互不q扰Q也保证了系l只有一个SessionFactory实例Q对于大多数应用来说已经    _了)。如果你使用MyEclipseq行开发的话,它会自动生成一个  ?HibernateSessionFactory.javaQ其中就包含了以上代码?br />好了Q现在我们已l获得了SessionQ下面我来介l以下Session的常用函敎ͼq些函数都有很多重蝲函数Q我只介l以下大概是q嘛的,不一一解释Q详l信息你可以查看Hibernate的API?br />1QSession.get()Q获取某个类的实例,一般都是通过id来获取比?br />Session.get(Student.class, "0361095");
q句话的意思就是获取idQprimary keyQؓ?361095”的Student对象。这里要注  ?意的是第二个参数必须是ObjectQ也是_如果是longcd?Q那么必{换  ?成new Long(1)再传入?br />2QSession.load()Q用法和意义都和get一P不过它们q是有点区别Q我E后解释?br />3QSession.save()Q将某个实例保存到数据库中去Q往往在数据库中Ş成一条新的记录)?br />4QSession.update()Q更新某个实例,q个实例必须和数据库中有对应Q否则会报错?br />5QSession.delete()Q删除某个实例,也就是删除这个实例对应的数据表中的数据?br />6QSession.saveOrUpdate()Q保存或者更新某个实例,调用q个Ҏ(gu)你就不用d心到        底是saveq是update了,它会自己判断Q然后调用相应的函数。其实save和update        涉及到实体对象生命周期中的三U状态,q个比较重要Q我在后面会单独讲的?br />对于get和load的区别,很难讲清楚,q里涉及到Hibernate的缓存机Ӟ是一个非常  ?复杂的话题,我不打算深入讨论q个内容。简单的来讲QSession实现了Hibernate的一    U缓存,SessionFactory实现了Hibernate的二U缓存。loadҎ(gu)会先查找一U缓存再查  ?找二U缓存,最后再L据库中找Q而get只会查找一U缓存,然后去数据库中找了。  ?q只是是get和load的一个区别,另外的区别如果你有兴的话自己去google吧。关于Hibernate的缓存机Ӟ如果你只是一般用用Hibernate的话没有必要深入研究Q就当它不存在好了,get和load到底用哪个也不用非常讲究Q如果你用工L(fng)成DAO的话Q  ?生成的代码用什么就用什么吧?/p>

四、关键概늚理解
在用Hibernateq行开发的时候有几个概念在我看来是必ȝ解的Q否则在开发的时候会遇到很多问题而摸不着头脑?br />1QLazy loadingQ懒加蝲Qgq加载)
q个技术在很多地方被应用,比如Eclipse的插件管理也是用的gq加载。在Hibernate中,所谓gq加载就是返回一个POJO但是某些数据Q往往是实体类型或者SetcdQƈ没有被真正的被填充,直到POJO的某个字D늜正被引用的时候才从数据库中读取相应的数据来填充POJO中的字段。这样就能有效的避免很多不必要的数据库操作,因ؓPOJO的有些数据我们ƈ不需要,而且数据库操作是很费旉的。在Hibernate2中,默认是非延迟加蝲的,而在Hibernate3中,默认是延迟加蝲了?br />如果使用了gq加载,那么在读取数据的时候有一个问题必L意,那就是在数据真正被加载之前,Session不能被关闭。你可以回头看一下代码片D?Q我在构造函数里面open了session以后没有关闭这个sessionQ所以我在用的时候没有什么问题,但这hd着数据库连接也不好Q用好了应该及时关闭l别人用。我上文l的例子中没有关闭Session的代码,要加的话lDAO加一个方法调用Session.close()Q然后在代码片段1中的return之前调用q个Ҏ(gu)p了?br />Hibernate的gq加载机制远不是q么单,但是普通的应用没有必要LI这些东西,了解q么多就够了?/p>

2Q?Object lifecycleQ对象生命周?br />在Hibernate中,对象分ؓ三种状态,TransientQ自q态)、PersistentQ持久状态)QDetachedQ游ȝ态)Q下面我分别解释一下?br />1、自q态:所谓自q态就是说q个对象是自qQ与Hibernate无关Q比       如:
Student student = new Student();
    student.setId("0361095");
                q里的student是一个普通的对象与hibernate无关Q称q态?/p>

2、持久状态:所谓持久状态就是指对象和数据库中的数据Q持久状态的数据Q     ?有关联,也就是说对象被Hibernate所理了,比如Q?br />session.save(student);
   q样student对象׃自由状态变为持久状态了。持久状态的对象在Session       与数据库中的数据q行同步Ӟ比如commitQ会把数据更新到数据库。而       ?其他状态的则不会。我觉得可以q样来理解持久状态,可以看成Hibernate       也拥有一份对象的引用Q那么如果你Ҏ(gu)久状态对象的属性进行更改的话,       Hibernate看到的对象的状态也更改了,而Hibernate所看到的对象和数据       库中的数据是{h(hun)的。也正是q样QHibernate才实CObject/Relation       的映。类似的Qload和getҎ(gu)也一样会获取Persistent状态的对象?/p>

3、游ȝ态:每次调用Session.close以后Q所有跟q个session有关的处?br />Persistant的对象就变成了游ȝ态。也怽要问Detached和Transient有什么区别。其实从我给的例子来说看不出什么区别,因ؓ我这里ID是给定的Q而真正开发的时候ID往往是自增的Q那么Transient的对象是没有ID    的,当save了以后就有了Q显而易见Detached的对象也是有IDQ只不过q个对象已经和Hibernateq了关pR但是游ȝ态的对象仍然和数据库    中的记录有一定联p,臛_游离状态的对象知道数据库中有条记录的ID为xxx。从q一点上来讲Q游ȝ态是可以自己创造出来的Q只要你知道数据库中的主键信息?br />在用Hibernate开发的时候要分清楚这三种状态,否则很容易出错。比如不能去save一个游ȝ态的对象Q不能去update一个自q态的对象{等?/p>

五、结束语
       我要讲的p么多Q这文章不是详l介lHibernateQ我只是ȝ了自己学?fn)和使用Hibernate的一些感受和l验Q希望能l没有用qHibernate的开发者一个上手的指引。如果你看完了这文章仍然满头雾_无从下手的话Q我只能向你表示歉意Q浪费你的时间了。不怎样Q我强烈推荐一本书《深入浅出Hibernate》,q本书既能作为学?fn)的教程Q也能作为日后的查询用书Q相当实用?br />



]]>
վ֩ģ壺 av뾫Ʒ| þþžѸƵ| M ŷSSSS222| ðѾƷƵ | hƵѹۿ| պһ| ˿Ƶվ| avۺavһ| ɫݺݰվ| ƷþþþóѶ| AVרAV| avպav߹ۿ| ѹۿƵ㶮| ɫƷva߹ۿƵ| Ůۺһ| Ʒާv벥| ޾Ʒһ| һѹۿ| ĻþþƷA| ձ߹ۿ| Ů18ؼһëƬƵ| ˳Ƶ69| GVͬ߹ۿ| ޺Ļ| avҹƷһ| ޸Ļ| Ļһ| 337Pձŷ޴󵨾Ʒ| һëƬƵ| ͵͵͵ɫ| ĻӰԺƵ| Ѹ߲| պƷƷƵ߹ۿ | ձۺϸ| ޹һҳwww| ޾Ʒþþþþò| ɫAV| ߹ۿվ| 24Сʱձwwwѵ| 99Ʒѹۿ| avƬ߹ۿվ|