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

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

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

    Junky's IT Notebook

    統(tǒng)計

    留言簿(8)

    積分與排名

    WebSphere Studio

    閱讀排行榜

    評論排行榜

    Distributed Objects With Hibernate

    Distributed Objects With Hibernate

    Problem:

    You are building a three tier distributed system and you are passing persistent objects between tiers. When you send the objects back to the server, you want to save the only the changes.

    Solutions:


    1)Hibernate added the select-before-update option in 2.1. Setting this option on your class will cause Hibernate to load the data from the database and compare that to the data in your object to determine what has changed. It makes use of a version or timestamp field to enforce optimistic concurrency. This works well but introduces additional database access that could effect performance.

    2)Save the original data for each persistent object and implement a custom EntityPersister to return the original state to Hibernate instead of accessing the state in the database.

    Implementing Solution 2:

    Step 1: Save the original state for each persistent object

    The easiest way to implement this is to have each persistent object remember the original values of any properties that changed. If you make all your persistent objects proper JavaBeans, you can capture this in the base class when the object fires a propertyChanged event:

    public abstract class AbstractDomainObject implements Serializable {
    private PropertyChangeSupport support = new PropertyChangeSupport(this);
    private Map originalValues = new HashMap();
    public AbstractDomainObject() {
    super();
    }
    public Map getOriginalState() {
    return originalValues;
    }
    public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener) {
    support.addPropertyChangeListener(propertyChangeListener);
    }
    protected void firePropertyChange(String property, Object oldValue, Object newValue) {
    if (!originalValues.containsKey(property)) {
    originalValues.put(property, oldValue);
    }
    support.firePropertyChange(property, oldValue, newValue);
    }
    }

    Step 2: Create your domain objects

    A domain object might look like follows. Because it fires propertyChange events, the base class will remember original values of properties that changed. Note that you will want to map the properties as access=field since the setter fires a propertyChange event when called.

    public class Customer extends AbstractDomainObject {
    private String name;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    String oldValue = this.name;
    this.name = name;
    firePropertyChange("name", oldValue, name);
    }
    }

    Step 3: Create a custome entity persister

    Create a custom entity persister and override getCurrentPersistentState. Set the persister for each class to this custom persister.

    public Object[] getCurrentPersistentState(Serializable id, Object version, SessionImplementor session) throws HibernateException {
    AbstractDomainObject entity = (AbstractDomainObject) session.getEntity(new Key(id, this));
    Map originalValues = entity.getOriginalState();
    Type[] types = getPropertyTypes();
    String[] propertyNames = getPropertyNames();
    Object[] values = new Object[propertyNames.length];
    boolean[] includeProperty = getPropertyUpdateability();
    for (int i = 0; i < propertyNames.length; i++) {
    if (includeProperty[i]) {
    if (originalValues.containsKey(propertyNames[i])) {
    values[i] = types[i].disassemble(originalValues.get(propertyNames[i]), session);
    } else {
    values[i] = types[i].disassemble(getPropertyValue(entity, propertyNames[i]), session);
    }
    }
    }
    return values;
    }

    What about collections you ask? Well, Hibernate keeps track of changes to collections in the collection class wrappers for you.

    Please note this solution has worked great in my example programs, but I have not yet implemented it in a production program.

    posted on 2006-10-17 14:09 junky 閱讀(406) 評論(0)  編輯  收藏 所屬分類: hibernate

    主站蜘蛛池模板: 在线视频网址免费播放| 国产福利在线观看永久免费| 最近中文字幕完整版免费高清| 久久亚洲中文字幕精品一区四 | 亚洲日韩中文字幕| 99精品一区二区免费视频| 亚洲成AV人在线播放无码| 日本免费电影一区二区| 国产亚洲综合一区柠檬导航| 中文无码成人免费视频在线观看 | 四虎永久在线精品免费影视 | 亚洲狠狠婷婷综合久久| 日本一道在线日本一道高清不卡免费| 亚洲人成图片网站| 国产精品免费小视频| 一级一级一片免费高清| 亚洲日韩中文字幕在线播放| 99在线观看视频免费| tom影院亚洲国产一区二区| 成人免费看吃奶视频网站| 在线观看亚洲免费视频| 亚洲中文字幕在线乱码| 最近中文字幕无免费| 亚洲AV无码成人精品区日韩 | 亚洲黄色免费电影| 性感美女视频免费网站午夜| 四虎成人精品国产永久免费无码| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 最好免费观看韩国+日本| 免费人成又黄又爽的视频在线电影| 亚洲精品无码AV中文字幕电影网站| 岛国精品一区免费视频在线观看| 亚洲国产天堂久久综合网站| 成熟女人特级毛片www免费| 成人免费夜片在线观看| 久久精品国产亚洲AV嫖农村妇女| 成年人网站在线免费观看| fc2免费人成为视频| 亚洲成人黄色在线| 不卡一卡二卡三亚洲| 曰批全过程免费视频在线观看|