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

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

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

    Junky's IT Notebook

    統計

    留言簿(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 閱讀(415) 評論(0)  編輯  收藏 所屬分類: hibernate

    主站蜘蛛池模板: 亚洲av无码成人影院一区| 亚洲色精品VR一区区三区| 久久精品免费网站网| 免费在线一级毛片| 日产久久强奸免费的看| 亚洲国产成人精品女人久久久 | 精品亚洲A∨无码一区二区三区 | 99国产精品永久免费视频| 亚洲精品美女视频| 在线观看AV片永久免费| 成人亚洲国产va天堂| 精品久久免费视频| 免费观看四虎精品成人| 狠狠色婷婷狠狠狠亚洲综合| aa级毛片毛片免费观看久| 亚洲91av视频| 成人特黄a级毛片免费视频| 亚洲成a人无码亚洲成www牛牛| 免费v片视频在线观看视频| 永久免费无码日韩视频| 亚洲精品午夜无码专区| 最近中文字幕免费2019| 成人亚洲国产va天堂| 亚洲免费在线观看| 色猫咪免费人成网站在线观看| 亚洲国产精品白丝在线观看 | 亚洲一级黄色视频| 性xxxxx大片免费视频| 亚洲中文字幕久久精品无码VA| 免费国产a国产片高清网站| 中文精品人人永久免费| 亚洲性一级理论片在线观看| 日本不卡高清中文字幕免费| 一级毛片免费播放试看60分钟| 亚洲图片一区二区| 免费无遮挡无码视频网站| 国产高清对白在线观看免费91| 亚洲福利一区二区精品秒拍| 国产无遮挡又黄又爽免费视频| 国产无遮挡裸体免费视频在线观看| 91亚洲性爱在线视频|