您的位置:威尼斯官方网站 > 威尼斯正规官网 > 由数据库管理生命周期

由数据库管理生命周期

发布时间:2019-12-31 23:27编辑:威尼斯正规官网浏览(162)

    三个PO有二种情况:
    1、未被持久化的VO
    那儿就是三个内部存款和储蓄器对象VO,由JVM管理生命周期
    2、已被长久化的PO,并且在Session生命周期内
    那会儿映射数据库数据,由数据库管理生命周期
    3、曾被漫长化过,但现行和Session已经detached了,以VO的地位在运维
    这种和Session已经detached的PO仍是可以够步向另一个Session,继续开展PO状态处理,那时它就改成PO的第三种情形了。这种PO实际上是跨了Session实行了情景维护的。
    在古板的JDO1.x中,PO唯有前边二种景况,一个PO一旦脱离PM,就丧失了动静了,不再和数据库数据涉嫌,成为三个从头到尾的内部存款和储蓄器VO,它正是走入多个新的PM,也无法回复它的情形了。
    Hibernate强的地方就在于,贰个PO脱离Session之后,还是能够保险状态,再步入多个新的Session之后,就过来情况管理的工夫,但此刻情景管理亟待运用session.update或许session.saveOrUpdate,那就是Hibernate Reference中涉嫌的“requires a slightly different programming model ”
    最近规范步向本话题:
    大约的来说,update和saveOrUpdate是用来对跨Session的PO举行情况处理的。
    如若你的PO没有要求跨Session的话,那么就不需求使用,举例你张开八个Session,对PO实行操作,然后破产,之后那些PO你也不会再用到了,那么就不要求用update。
    所以,大家来看看上例:
    Java代码
    Foo foo=sess.load(Foo.class,id);;
    foo.setXXX(xxx);;
    sess.flush();;
    sess.commit();;

    Foo foo=sess.load(Foo.class,id);;
    foo.setXXX(xxx);;
    sess.flush();;
    sess.commit();;
    Foo foo=sess.load(Foo.class,id);;
    foo.setXXX(xxx);;
    sess.flush();;
    sess.commit();;
    PO对象foo的操作都在一个Session生命周期内完毕,由此无需显式的进展sess.update(foo卡塔尔国这样的操作。Hibernate会自动监测到foo对象已经被改造过,因而就向数据库发送五个update的sql。当然假若你非要加上sess.update(fooState of Qatar也不会错,只不过尔尔做未有此外供给。
    而跨Session的乐趣乃是那么些PO对象在Session关闭之后,你还把它看成二个VO来用,后来你在Session外面又涂改了它的习性,然后您又想展开二个Session,把VO的特性修正保存到数据Curry面,那么您就须求用update了。
    Java代码
    // in the first session
    Cat cat = (Cat); firstSession.load(Cat.class, catId);;
    Cat potentialMate = new Cat();;
    firstSession.save(potentialMate);;
    // in a higher tier of the application
    cat.setMate(potentialMate);;
    // later, in a new session
    secondSession.update(cat);; // update cat
    secondSession.update(mate);; // update mate

    // in the first session
    Cat cat = (Cat); firstSession.load(Cat.class, catId);;
    Cat potentialMate = new Cat();;
    firstSession.save(potentialMate);;
    // in a higher tier of the application
    cat.setMate(potentialMate);;
    // later, in a new session
    secondSession.update(cat);; // update cat
    secondSession.update(mate);; // update mate
    // in the first session
    Cat cat = (Cat); firstSession.load(Cat.class, catId);;
    Cat potentialMate = new Cat();;
    firstSession.save(potentialMate);;
    // in a higher tier of the application
    cat.setMate(potentialMate);;
    // later, in a new session
    secondSession.update(cat);; // update cat
    secondSession.update(mate);; // update mate
    cat和mate对象是在第二个session中获取的,在首先个session关闭之后,他们就成了PO的第三种情况,和Session已经detached的PO,这时候他们的意况音信依旧被保存下来了。当她们进去第2个session之后,立即就足以扩充状态的更新。可是由于对cat的更改操作:cat.setMate(potentialMate卡塔尔国; 是在Session外面进行的,Hibernate不容许精通cat对象已经被改善了,第4个Session并不知道这种校勘,由此必定要显式的调用secondSession.update(catState of Qatar; 布告Hibernate,cat对象已经改善了,你不得不发送update的sql了。
    所以update的功用就在于此,它只会被用来当三个PO对象跨Session举市场价格况同步的时候才需求写。而三个PO对象当它无需跨Session实行意况处理的时候,是无需写update的。
    再谈谈saveOrUpdate的用场:
    saveOrUpdate和update的界别就在于在跨Session的PO状态管理中,Hibernate对PO选用何种政策。
    譬喻说当你写多少个DAOImpl的时候,让cat对象扩展叁个mate,如下概念:
    Java代码
    public void addMate(Cat cat, Mate mate); {
    Session session = ...;
    Transacton tx = ...;
    session.update(cat);;
    cat.addMate(mate);;
    tx.commit();;
    session.close();;
    };

    public void addMate(Cat cat, Mate mate); {
    Session session = ...;
    Transacton tx = ...;
    session.update(cat);;
    cat.addMate(mate);;
    tx.commit();;
    session.close();;
    };
    public void addMate(Cat cat, Mate mate); {
    Session session = ...;
    Transacton tx = ...;
    session.update(cat);;
    cat.addMate(mate);;
    tx.commit();;
    session.close();;
    };
    显然你是急需把Hibernate的操作封装在DAO里面包车型客车,让业务层的技术员和Web层的程序员无需了然Hibernate,直接对DAO进行调用。

    本文由威尼斯官方网站发布于威尼斯正规官网,转载请注明出处:由数据库管理生命周期

    关键词:

上一篇:一个通用的jsp分页PageBean

下一篇:没有了