2012-03-30 11 views
4

Wir arbeiten an einem neuen System, das Hibernate für die Persistenz verwendet. Wenn sich das Schema ändert, verwenden wir NetBeans, um die Entitätsklassen neu zu generieren.Geschäftsmethoden zu automatisch generierten Hibernate-Entitäten hinzufügen

Während sich das System entwickelt, finden wir eine Menge Funktionen, die als Geschäftsmethoden in den Entitäten hinzugefügt werden, aber weil wir diese Klassen von Zeit zu Zeit regenerieren, zögern wir dies zu tun.

Gibt es eine elegante Möglichkeit, Entitätsklassen neu zu generieren und Geschäftslogik hinzuzufügen, z. B. in einer Unterklasse, die Hibernate verwenden würde?

Vielen Dank,

Ian.

Antwort

2

Nicht, dass ich mir dessen bewusst bin. Ich habe jedoch eine Lösung für Sie.

Der Business-Logik-Code muss irgendwo hingehen - die Frage ist, wo es hingestellt werden soll. Sie könnte setzen Sie es auf die @Entity, Kennzeichnung Business Getters mit @Transient, aber gutes Design sagt, eine separate Klasse DAO Klasse zu verwenden.

Trennung Geschäft von Persistenz-Code folgt dem "high cohesion" Konstruktionsprinzip, geben Sie:

  • Ihre Entitätsklasse sauber bleibt - dh, es Code hat ausschließlich auf Persistenz bezogen. Da Sie nichts hinzugefügt haben, kann es jederzeit sicher regeneriert werden.
  • Ihre "Geschäftslogik" -Klasse (oft mit dem gleichen Namen wie die Entitätsklasse, aber mit "Dao" zum Namen hinzugefügt, z. B. CustomerDao) hat Methoden, um mit (in der Regel natürlich-genarbten) Verhalten umzugehen. Unit-Tests sind normalerweise auch einfacher, weil Sie nicht die Entity-Methoden testen möchten (Sie können davon ausgehen, dass sie funktionieren - es ist nicht Ihr Code) und Ihren Code leichter entwerfen können, um ein einfaches Mocking einer Entität zu ermöglichen (das ist kein echte Einheit)

Sie können möglicherweise einige Wiederverwendung nutzen, indem sie eine typisierte abstrakte DAO-Klasse für das Verhalten gemeinsam Einheiten zu schaffen (wo/wenn es Sinn macht).

+0

+1 Wenn Sie diesen Weg der Verwendung von DAOs gehen, dann werfen Sie einen Blick auf https://community.jboss.org/wiki/GenericDataAccessObjects. –

+0

Danke für diese Antworten. Ich hatte gehofft, dass jemand etwas mehr OO vorschlagen würde, aber ich denke, niemand benutzt den Winterschlaf auf diese Weise. Wir haben DAOs für jede unserer Entitäten, damit diese Funktionalität möglich ist. –

+5

Es stellt sich heraus, dass ich nicht die einzige Person bin, die mit dummen Entitätsobjekten unzufrieden ist: Das Anemic Domain Model Anti-Pattern http://www.martinfowler.com/bliki/AnemicDomainModel.html –

1

Es gibt einen Unterschied zwischen Geschäftsmodell und Geschäftslogik. Die Logik wirkt über das Modell, um einen Dienst bereitzustellen. Normalerweise sollten die Entitäten das Modell widerspiegeln, während DAOs und Services die Geschäftslogik widerspiegeln sollten. Für mich ist es komisch, Geschäftslogik in den Entitäten zu haben.

Verwandte Themen