2010-01-18 39 views
11

我想知道在Java上使用HB來更新某個獨立對象的某些字段的最佳方法是什麼。特別是當對象具有子對象屬性時。對於實施例(註釋除去和字段數目減少,以降低噪聲):在Hibernate上更新分離對象的某些字段的最佳方法?

public class Parent { 
    int id; 
    String field2; 
    ... 
    Child child; 
} 

public class Child { 
    int id; 
    String field3; 
} 

當在MVC web應用我可以調用用於使用Session.get(Parent.class,123)父實例更新父,用它來填充表單並顯示它。沒有DTO,只是將分離的父級傳遞給視圖並綁定到表單。現在,我只想允許用戶更新父級的屬性field2。所以當用戶發佈表單時,我得到了一個id爲id和field2的Parent實例(我認爲mvc框架在這裏不重要,所有的行爲在綁定時都大致相同)。
現在,哪種策略最適合執行實體更新?我能想到的幾個選擇,但我想聽聽專家:)(記住,我不想失去父母和孩子實例之間的關係)

A)再次Retrive從會議父實例和用手取代更新的字段

Parent pojoParent; //binded with the data of the Form. 
Parent entity = Session.get(Parent.class,pojoParent.getId()); 
entity.setField2(pojoParent.getField2()).   

我用這個很多。但pojoParent似乎被用作臥底DTO。如果要更新的字段數量變大,它也會變得很糟糕。

B)將孩子存儲在某個地方(httpSession?)並將其關聯到後者。

Parent parent = Session.get(Parent.class,123); 
//bind the retrieved parent to the form 
// store the Child from parent.getChild() on the httpSession 
... 
//when the users submits the form... 
pojoParent.setChild(someHttpSessionContext.getAttribute('Child')) 
Session.save(pojoParent); 

我覺得這是廢話,但我看到了它在某些項目...

C)設置父母與子女作爲inmutable之間的關係。在關係上使用updatable = false我可以更新任何父字段而不用擔心丟失孩子。無論如何,這是相當嚴格的,並且這種關係永遠不會被更新。

那麼,您認爲解決這種情況的最佳方法是什麼?

預先感謝您!

回答

10

加載父對象後,你說

現在,我只希望允許用戶更新父的場2屬性

根據使用情況,您可以使用UpdateableParent對象

public class UpdateableParent { 

    private String field2; 

    // getter's and setter's 

} 

現在我們的家長資源庫

@Repository 
public class ParentRepositoryImpl implements ParentRepository { 

    @Autowired 
    private SessionFactory sessionFactory; 


    public void updateSpecificUseCase(UpdateableParent updateableParentObject) { 

     Parent parent = sessionFactory.getCurrentSession().load(Parent.class, updateableParentObject.getId()); 

     try { 
      // jakarta commons takes care of copying Updateable Parent object to Parent object 

      BeanUtils.copyProperties(parent, updateableParentObject); 
     } catch (Exception e) { 
      throw new IllegalStateException("Error occured when updating a Parent object", e); 
     } 

    } 

} 

其優點

  • 它是安全的:你只需更新你真正想要的
  • 您不必擔心MVC框架(一些MVC框架允許您設置allowedFields屬性)。如果你忘記了一些允許的字段會怎樣?

雖然這不是一個技術相關的問題,但Seam框架允許您只更新你想要的。所以你不必擔心使用什麼樣的模式。

問候,

0

您可以直接修改分離的對象,然後使用會話上的merge方法將對象重新掛接到會話。

3

A)從 再次Retrive父實例的會話,並用手 更換更新的字段

這似乎是我使用過的功能最全的版本過去幾年。

B)存放兒童某處 (HttpSession的?)和準它 後者。

我會建議不要這樣做,特別是如果你想遵循REST範例,它使服務器端狀態成爲一個完整的禁止否定。你會最終使用的堆空間對脫管對象,但誰發起會話的用戶離開咖啡:)

C)設置家長和兒童 作爲永恆不變的關係。

恕我直言,這也不是一個好方法,雖然它可以適用於小型持久模型的項目。但即使在一個小應用程序中,當嘗試修改代碼時也可能導致頭痛。

相關問題