2017-06-05 3 views
0

Ich beginne ein Projekt mit Spring MVC und Hibernate. Ich bin besorgt über Best Practices im Zusammenhang mit der Klassenzusammensetzung. Angenommen, ich hätte eine Klasse namens Benutzer mit einer ORM-Technologie wie Hibernate.Java Spring MVC + Hibernate Klassenzusammensetzung

Ich bin mir nicht sicher, ob ich alles im Zusammenhang mit der User-Entität innerhalb der Benutzerklasse enthalten sollte. Ich weiß, dass Hibernate automatisch die Leistung durch Lazy Loading verbessert, so dass nicht alle Instanzvariablen abgerufen werden, wenn wir einen Benutzer abrufen. Ich habe jedoch das Gefühl, wenn wir zu viele Variablen in die User-Klasse aufnehmen, wird es sehr teuer, User-Objekte abzufragen.

Betrachten Sie dieses Beispiel:

@Entity 
@Table(name = "Users") 
public class User{ 

private String username; 
private String password; 
private long user_id; 

private Collection<Transaction> transactions; 

} 

Hier werden die User-Klasse speichert eine Sammlung von Transaktionen. Jede Transaktion stellt einen Kauf dar, den der Nutzer auf der Website getätigt hat. Wir müssen jedoch keine Transaktionssammlung für jeden Benutzer speichern.

Stattdessen können wir eine Transaktionstabelle wie so machen:

@Entity 
@Table(name = "UserTransactions) 
public class Transaction{ 

    private int user_id; 
    private int order_id; 
    private double amount_paid; 
} 

Mit dieser Transaktion Tabelle können wir noch jede Transaktion speichern jeder Benutzer gemacht hat.

Dies ist nur ein Beispiel, es gibt viel mehr Variablen, die nicht in der Benutzerklasse gespeichert werden müssen und können durch ihre eigene Tabelle dargestellt werden. Ich frage mich also, ob es einen Schaden für die Speicherung all dieser Variablen in der Benutzerklasse gibt, oder sollten wir vorsichtig sein und selektiv sein, was wir in die Benutzerklasse einbeziehen? Was wären die Vor-/Nachteile jedes Ansatzes?

Vielen Dank im Voraus!

+0

Was möchten Sie fragen? Wie erstelle ich Beziehungen zwischen Ruhezustands-Entitäten? –

Antwort

2

Es scheint, dass Sie eine Eins-zu-viele-Beziehung zwischen User und UserTransation haben. Ein Benutzer kann viele Transaktionen haben und eine Transaktion wird von nur einem Benutzer ausgeführt.

Also ich verstehe nicht, warum Sie sich fragen, ob Sie alles in User speichern sollten. Du kannst nicht. Sie müssen 2 Domänenobjekte User und UserTransaction mit einer Eins-zu-viele-Beziehung (mit einer Benutzer- und einer (Benutzer-) Transaktionstabelle in der Datenbank) haben. Wenn Sie dann einen Benutzer mit Hibernate abfragen, verwenden Sie standardmäßig "lazy-loading", um keine Verknüpfung mit Transaction herzustellen. Für Datenzugriffsmuster, die Transaction benötigen, machen Explicity einen "Fetch Join", um den Benutzer und seine Transaktionen in einer einzigen SQL-Abfrage zu erhalten.

1

Wenn Sie nicht alle Variablen in der Datenbank speichern wollen, dann können Sie sie

@Column(insertable=false, updatable=false) or @transient 

mit beschränken und Transaktionstabelle verwendet, wird ein besserer Ansatz sein, wo nur TRANSACTION_ID und user_id gibt es und ruhen alle Benutzerdetails, die Sie in einer anderen Tabelle speichern können, da sie organisierter und normalisierter ist und weniger Overhead verursacht

Verwandte Themen