2010-01-18 23 views
11

Mi chiedevo quale sia il modo migliore per aggiornare alcuni campi di un oggetto dettached usando HB su Java. Specialmente quando l'oggetto ha attributi di oggetti figlio. Per esempio (annotazioni rimossi e campi numero ridotto per ridurre il rumore):Il modo migliore per aggiornare alcuni campi di un oggetto distaccato su Hibernate?

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

public class Child { 
    int id; 
    String field3; 
} 

Quando si aggiorna un genitore in una webapp MVC ho potuto chiamare un'istanza genitore utilizzando Session.get (Parent.class, 123), usalo per compilare un modulo e visualizzarlo. Nessun DTO, solo il genitore distaccato viene passato alla vista e associato a un modulo. Ora, voglio solo consentire all'utente di aggiornare l'attributo campo2 del genitore. Quindi, quando l'utente invia il modulo, ottengo un'istanza Parent con id e field2 filled (penso che il framework mvc non abbia importanza qui, tutti si comportano per lo più allo stesso modo quando si esegue il binding).
Ora, quale strategia è la migliore per eseguire l'aggiornamento dell'entità? Posso pensare a poche alternative, ma voglio sentire gli esperti :) (ricordiamo che non voglio perdere il rapporto tra il genitore e il bambino le istanze)

A) Recupera l'istanza Parent dalla sessione di nuovo e sostituire a mano i campi aggiornati

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

Sto usando questo molto. Ma il pojoParent sembra essere usato come DTO sotto copertura. Inoltre diventa terribile se il numero di campi da aggiornare diventa più grande.

B) Archiviare il Bambino da qualche parte (httpSession?) E associarlo a quest'ultimo.

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); 

penso che questo è merda, ma l'ho visto in alcuni progetti ...

C) variare la relazione tra genitore e figlio, come inmutable. Usando aggiornabile = falso sulla relazione Posso aggiornare qualsiasi campo genitore senza preoccuparmi di perdere il bambino. Ad ogni modo, questo è abbastanza restrittivo e la relazione non verrà mai aggiornata.

Quindi, quale pensi sia il modo migliore per risolvere questa situazione?

Grazie in anticipo!

risposta

10

Dopo aver caricato un oggetto padre, hai detto

Ora, voglio solo per consentire all'utente di aggiornare l'attributo field2 del genitore

Sulla base di Caso d'uso, è possibile utilizzare un UpdateableParent opporsi

public class UpdateableParent { 

    private String field2; 

    // getter's and setter's 

} 

Ora il nostro repository Parent

@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); 
     } 

    } 

} 

suoi vantaggi

  • E 'sicuro: solo aggiornare ciò che si vuole veramente
  • Non dovete preoccuparvi di framework MVC (Alcuni framework MVC permette di impostare una proprietà allowedFields). Cosa succede se dimentichi alcuni campi consentiti ???

Anche se non è una domanda relativa alla tecnologia, il framework Seam consente di aggiornare solo ciò che si desidera. Quindi non devi preoccuparti di quale schema usare.

saluti,

0

È possibile modificare direttamente l'oggetto scollegato e quindi ricollegare l'oggetto alla sessione utilizzando il metodo merge sulla sessione.

3

A) retrive l'istanza Parent dal sessione nuovamente e sostituire manualmente i campi aggiornati

questo sembra essere la versione più funzionale che ho usato sulla negli ultimi anni.

B) Conservare il bambino da qualche parte (HTTPSession?) E associarlo quest'ultimo.

Vorrei sconsigliarlo, soprattutto se si desidera seguire il paradigma REST che rende lo stato lato server completo no-no. E si finirà per utilizzare lo spazio heap per oggetti unifamiliari, anche se l'utente che ha avviato la sessione ha lasciato per un caffè :)

C) Impostare il rapporto tra genitore e figlio come immutabile.

IMHO questo non è un buon modo, anche se sarebbe adatto per un piccolo progetto con un piccolo modello di persistenza. Ma anche in una piccola applicazione potrebbe causare mal di testa quando si tenta di modificare il codice.

Problemi correlati