11 Stimmen

Beste Möglichkeit, einige Felder eines abgetrennten Objekts in Hibernate zu aktualisieren?

Ich fragte mich, was ist der beste Weg, um einige Felder eines Dettached-Objekts mit HB auf Java zu aktualisieren. Vor allem, wenn das Objekt Kind Objekte Attribute hat. Zum Beispiel (Anmerkungen entfernt und Felder Anzahl reduziert, um Lärm zu reduzieren):

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

public class Child {
   int id;
   String field3;
} 

Wenn ich einen Parent in einer MVC-Webapp aktualisiere, könnte ich eine Parent-Instanz aufrufen, indem ich Session.get(Parent.class,123) verwenden Sie es, um ein Formular auszufüllen und anzuzeigen. Keine DTOs, nur die abgetrennte übergeordnete wird an die Ansicht übergeben und an ein Formular gebunden. Jetzt möchte ich nur dem Benutzer erlauben, die Feld2 Attribut des Elternteils. Also, wenn der Benutzer Beiträge das Formular erhalte ich eine Parent-Instanz mit der id und field2 gefüllt (ich denke, die mvc-Framework nicht egal hier, alle verhält sich meist das gleiche, wenn Bindung).
Welche Strategie ist nun die beste, um die Aktualisierung der Entität durchzuführen? Ich kann in einigen Alternativen denken, aber ich möchte die Experten zu hören :) (Denken Sie daran, dass ich die Beziehung zwischen der übergeordneten und der untergeordneten Instanz nicht verlieren möchte)

A) Rufen Sie die Parent-Instanz aus der Session wieder auf und ersetzen Sie die aktualisierten Felder von Hand

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

Ich benutze das sehr oft. Aber die pojoParent scheint als eine verdeckte DTO verwendet werden. Auch wird es schrecklich, wenn die Anzahl der Felder zu aktualisieren wird größer.

B) Speichern Sie das Child irgendwo (httpSession?) und verknüpfen Sie es später.

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

Ich denke, das ist Quatsch, aber ich habe es in einigen Projekten gesehen...

C) Setzen Sie die Beziehung zwischen Parent und Child als unveränderlich. Verwendung von aktualisierbar=false über die Beziehung kann ich jedes übergeordnete Feld aktualisieren, ohne mir Sorgen um den Verlust des untergeordneten Feldes zu machen. Wie auch immer, dies ist ziemlich restriktiv und die Beziehung wird nie aktualisiert werden.

Was ist Ihrer Meinung nach der beste Weg, diese Situation zu lösen?

Vielen Dank im Voraus!

10voto

Arthur Ronald Punkte 32423

Nachdem Sie ein Parent-Objekt geladen haben, sagten Sie

Jetzt möchte ich dem Benutzer nur erlauben, das Attribut field2 des übergeordneten Elements zu aktualisieren

Je nach Anwendungsfall können Sie ein UpdateableParent-Objekt verwenden

public class UpdateableParent {

   private String field2;

   // getter's and setter's

}

Jetzt unser übergeordnetes Repository

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

    }

}

Seine Vorteile

  • Es ist sicher: Sie aktualisieren nur, was Sie wirklich wollen
  • Sie müssen sich nicht um das MVC-Framework kümmern (bei einigen MVC-Frameworks können Sie eine Eigenschaft "allowedFields" einrichten). Was passiert, wenn Sie einige erlaubte Felder vergessen?

Obwohl es sich nicht um eine technologiebezogene Frage handelt, Naht Framework können Sie nur das aktualisieren, was Sie wollen. Sie müssen sich also keine Gedanken darüber machen, welches Muster Sie verwenden sollen.

Grüße,

3voto

fasseg Punkte 17116

A) Holen Sie sich die Parent-Instanz von der Sitzung zurück und ersetzen Sie von Hand die aktualisierten Felder

Dies scheint die funktionellste Version zu sein, die ich in den letzten Jahren verwendet habe.

B) Lagern Sie das Kind irgendwo (httpSession?) und verknüpfen Sie es letzteres.

Ich würde davon abraten, vor allem, wenn Sie dem REST-Paradigma folgen wollen, das serverseitige Zustände zu einem absoluten Tabu macht. Und Sie werden am Ende Heap-Speicher für losgelöste Objekte verwenden, obwohl der Benutzer, der die Sitzung initiiert hat, zum Kaffee gegangen ist :)

C) Setzen Sie die Beziehung zwischen Parent und Child als unveränderlich.

IMHO ist dies auch kein guter Weg, obwohl es für ein kleines Projekt mit einem kleinen Persistenzmodell geeignet wäre. Aber selbst bei einer kleinen Anwendung kann es zu Kopfschmerzen führen, wenn man versucht, den Code zu ändern.

0voto

mR_fr0g Punkte 8084

Sie können das abgetrennte Objekt direkt ändern und das Objekt dann mit dem Befehl zusammenführen Methode für die Sitzung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X