Sollen Sie haben ein repository pro Tabelle in JPA?
Sollen Sie haben ein repository pro Tabelle in JPA? Wenn nicht, wie lösen Sie die Generika in der repository-Datenbank?
Zum Beispiel, unten ist ein StoreRepository
. Es behandelt CRUD Operationen auf die Store
Objekt. Wenn ich wollte, dass das repository zum speichern einer StoreEvent
Objekt als gut, wie würde ich mich über die änderung der Schnittstelle unten, um Platz für beide Objekte?
@Repository
public interface StoreRepository extends JpaRepository<Store, String> {
public Store findByGuid(String guid);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als repository ist ein Begriff, abgeleitet von Domain-Driven Design, denken über Datenbank-Tabellen ist der falsche Ansatz. Per definition Sie Zugang Aggregat Wurzeln aus einem repository. Effektiv ein repository ist die Simulation eine Auflistung dieser.
Nun, was bildet ein Aggregat root? Wahrscheinlich noch interessanter: was nicht? Das ist natürlich stark abhängig von Ihrer Domäne aber lassen Sie mich Ihnen ein Beispiel hier. Ein
Order
mitLineItems
in der Regel modelliert als aggregate root. Dies ist aufgrund der Zusammensetzung Art derOrder
. EinLineItem
würde nicht existieren ohne eine Sie umgebendeOrder
.In der Regel die Persistenz zugriffsmechanismen sollte Sie den domain-Prinzipien. Also, solltest du Modell sowohl
Order
undLineItem
als@Entity
Klassen aber nur schaffen eineOrderRepository
, da sich die form der aggregate root und eine effektive Kontrolle der Konsistenz der Regeln innerhalb des objektgraphen.Wir auch stark empfehlen nicht Verwendung des store-spezifischen repository-Basis-interfaces, da Sie - wie der name schon sagt - setzen store Besonderheiten (z.B.
flush()
) an die clients, die das nicht sollten sich bewusst sein, wenn möglich. Lesen Sie mehr dazu in meiner Antwort hier.@Entity
wenn Sie nicht haben einen Lebenszyklus, der sich unabhängig von seiner übergeordneten Einheit Um. Ich glaube, es sollte modelliert werden, wie@Embeddable
in der definierenden Klasse LineItem und nicht als@Entity
.