簡體   English   中英

將復雜項目重構為 JPA 或 Hibernate

[英]Refactoring complex project to JPA or Hibernate

我有足夠大並且已經在工作的項目,不是由程序員編寫的,而是由科學家編寫的。 該程序在一個巨大的 object 樹中保存了大量數據。 幾乎所有涉及的類都是可變的,甚至更多——它們傾向於在幾乎所有方法中更改其他對象的 state,甚至是 getter 和 setter。 這個 object 樹通過 java 序列化存儲到磁盤。

我的任務是從序列化遷移到數據庫,以減少 memory 的消耗。 手動重構大量的可變變量,在一些未知的時間點相互改變完全是地獄,尤其是對我來說——不知道主題域。

對於這種情況,是否有任何方法、實踐或重構模式?

我想你已經在主題行中回答了你的問題。 Using JPA or Hibernate with Annotations, you can take the existing object model and treat each object class as it's own table. 不要擔心一開始就有限制。

在每個 class 中,添加一個 id 屬性,以便存儲,並實現equalshashCode (所以你必須弄清楚是什么讓 object 等於另一個)。 這將有助於避免在數據庫中創建重復項。

您將需要編寫代碼來保留現有記錄。 也許訪問者模式在這里很合適。 向每個域 object 添加一個方法,該方法獲取訪問者並調用它來持久化 object。

public DomainObject { 
  public DomainObject() {} 
  private int id; public int getId() { return id; } public void setId(int id) { this.id = id; }
  private OtherObject myref;
  // properties for 'myref' and other existing public fields may need to be added
  void visit(IVisitor iv) {
    // traverse object tree to hit leafs first
    myref.visit(iv); 
    // pass to other referenced objects too.
    iv.visit(this);
  }

  public boolean equals(Object alt) { return alt.id == id; }
  public int hashCode() { return id.hashCode(); }
}

public interface IVisitor { 
  public void visit(Object o);
  public void visit(DomainObject do);
}

public class PersistVisitor implements IVisitor {

  // Your favorite injection annotation, perhaps, or populate through constructor
  EntityManager em;

  public void PersistVisitor(EntityManager em) { this.em = em; }

  public void visit(Object o) {
    em.persist(o);
  }

  public void visit(DomainObject do) {
    // anything you need to do specifically for the DomainObject type
    visit((Object)o);
  }

}

在記錄的初始持久化之后,當您下次從 Session 或 EntityManager 加載根 object 時,Hibernate 將負責加載所有引用的實例。

隨着時間的推移,您可以將業務邏輯移出 model 類,但您不必一開始就這樣做。 Hibernate 將提交對 object model 中的任何實例所做的任何更改,例如現有代碼所做的更改。

(或者,我想您可以掛鈎 object 樹的反序列化,以便在反序列化時保留或查找對象。我將把它留給另一個用戶練習。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM