inverse = "true" Beispiel und Erklärung
Always put inverse=”true” in your collection variable ?
Es gibt viele Hibernate-Artikel, die versuchen, das "Inverse" mit vielen "offiziellen" Hibernate-Jargons zu erklären, was (zumindest für mich) sehr schwer zu verstehen ist. In einigen Artikeln wurde sogar vorgeschlagen, einfach zu vergessen, was „invers“ ist, und immerinverse=”true” in die Sammlungsvariable einzufügen.
Diese Aussage ist immer wahr - "set inverse = true in collection variable", aber nicht mit verbundenen Augen. Versuchen Sie, den Grund zu verstehen, der für die Optimierung Ihrer Leistung im Ruhezustand von wesentlicher Bedeutung ist.
Was ist "invers"?
Dies ist das verwirrendste Schlüsselwort in Hibernate, zumindest habe ich ziemlich lange gebraucht, um es zu verstehen. Das Schlüsselwort "inverse" wird immer in der Beziehung vonone-to-many undmany-to-manydeklariert (Viele-zu-Eins hat kein inverses Schlüsselwort). Dies bedeutet, welche Seite für die Betreuung verantwortlich ist Beziehung.
"Invers", sollte in "Beziehungsinhaber" geändert werden?
Im Ruhezustand sollte nur der "Beziehungseigentümer" die Beziehung verwalten, und das Schlüsselwort "Inverse" wird erstellt, um zu definieren, auf welcher Seite der Eigentümer die Beziehung verwaltet. Das Schlüsselwort "inverse" selbst ist jedoch nicht ausführlich genug. Ich würde vorschlagen, das Schlüsselwort in "relationship_owner" zu ändern.
Kurz gesagt, inverse = "true" bedeutet, dass dies der Eigentümer der Beziehung ist, und inverse = "false" (Standard) bedeutet, dass dies nicht der Fall ist.
1. Eine zu viele Beziehung
Dies ist dasone-to-many-Bezugstabellendesign. Eine STOCK-Tabelle kommt in der Tabelle STOCK_DAILY_RECORD häufig vor.
2. Implementierung im Ruhezustand
Weitere Informationen finden Sie in der Implementierung des Ruhezustands in XML-Zuordnungsdateien.
Datei: Stock.java
public class Stock implements java.io.Serializable { ... private SetstockDailyRecords = new HashSet (0); ...
Datei: StockDailyRecord.java
public class StockDailyRecord implements java.io.Serializable { ... private Stock stock; ...
Datei: Stock.hbm.xml
... ...
Datei: StockDailyRecord.hbm.xml
... ...
3. invers = wahr / falsch
Das umgekehrte Schlüsselwort wird in einer Beziehung von eins zu vielen angewendet. Hier ist die Frage, ob die Beziehung "stockDailyRecords" aktualisiert werden soll, wenn der Vorgang zum Speichern oder Aktualisieren im Objekt "Stock" ausgeführt wird.
Datei: Stock.hbm.xml
... ...
1. invers = "wahr"
Wenn inverse = "true" in der gesetzten Variablen, bedeutet dies, dass "stock_daily_record" der Eigentümer der Beziehung ist, sodass Stock die Beziehung NICHT AKTUALISIERT.
...
2. invers = "false"
Wenn inverse = "false" (Standard) in der festgelegten Variablen ist, bedeutet dies, dass "stock" der Eigentümer der Beziehung ist und Stock die Beziehung aktualisiert.
...
Weitere Beispiele finden Sie unten:
4. inverse = ”false” Beispiel
Wenn das Schlüsselwort "inverse" nicht definiert ist, wird inverse = "false" verwendet
...
Dies bedeutet, dass "Aktie" der Eigentümer der Beziehung ist und die Beziehung aufrechterhält.
Beispiel einfügen…
Wenn ein "Stock" -Objekt gespeichert wird, generiert Hibernate drei SQL-Anweisungen, zwei Einfügungen und eine Aktualisierung.
session.beginTransaction(); Stock stock = new Stock(); stock.setStockCode("7052"); stock.setStockName("PADINI"); StockDailyRecord stockDailyRecords = new StockDailyRecord(); stockDailyRecords.setPriceOpen(new Float("1.2")); stockDailyRecords.setPriceClose(new Float("1.1")); stockDailyRecords.setPriceChange(new Float("10.0")); stockDailyRecords.setVolume(3000000L); stockDailyRecords.setDate(new Date()); stockDailyRecords.setStock(stock); stock.getStockDailyRecords().add(stockDailyRecords); session.save(stock); session.save(stockDailyRecords); session.getTransaction().commit();
Ausgabe…
Hibernate: insert into exampledb.stock (STOCK_CODE, STOCK_NAME) values (?, ?) Hibernate: insert into exampledb.stock_daily_record (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE) values (?, ?, ?, ?, ?, ?) Hibernate: update exampledb.stock_daily_record set STOCK_ID=? where RECORD_ID=?
Stock aktualisiert die "stock_daily_record.STOCK_ID" über die Set-Variable (stockDailyRecords), da Stock der Eigentümer der Beziehung ist.
Note
Die dritte Aussage ist wirklich NICHT notwendig.
Beispiel aktualisieren…
Wenn ein "Stock" -Objekt aktualisiert wird, generiert Hibernate zwei SQL-Anweisungen, eine Einfügung und eine Aktualisierung.
session.beginTransaction(); Stock stock = (Stock)session.get(Stock.class, 57); StockDailyRecord stockDailyRecords = new StockDailyRecord(); stockDailyRecords.setPriceOpen(new Float("1.2")); stockDailyRecords.setPriceClose(new Float("1.1")); stockDailyRecords.setPriceChange(new Float("10.0")); stockDailyRecords.setVolume(3000000L); stockDailyRecords.setDate(new Date()); stockDailyRecords.setStock(stock); stock.getStockDailyRecords().add(stockDailyRecords); session.save(stockDailyRecords); session.update(stock); session.getTransaction().commit();
Ausgabe…
Hibernate: insert into exampledb.stock_daily_record (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE) values (?, ?, ?, ?, ?, ?) Hibernate: update exampledb.stock_daily_record set STOCK_ID=? where RECORD_ID=?
Note
Auch hier ist die dritte Anweisung NICHT erforderlich.
5. inverse = "true" Beispiel
Wenn das Schlüsselwort "inverse = true" definiert ist:
...
Jetzt bedeutet dies, dass "stockDailyRecords" der Eigentümer der Beziehung ist und "Aktie" die Beziehung nicht aufrechterhält.
Beispiel einfügen…
Wenn ein "Stock" -Objekt gespeichert wird, generiert Hibernate zwei SQL-Einfügeanweisungen.
session.beginTransaction(); Stock stock = new Stock(); stock.setStockCode("7052"); stock.setStockName("PADINI"); StockDailyRecord stockDailyRecords = new StockDailyRecord(); stockDailyRecords.setPriceOpen(new Float("1.2")); stockDailyRecords.setPriceClose(new Float("1.1")); stockDailyRecords.setPriceChange(new Float("10.0")); stockDailyRecords.setVolume(3000000L); stockDailyRecords.setDate(new Date()); stockDailyRecords.setStock(stock); stock.getStockDailyRecords().add(stockDailyRecords); session.save(stock); session.save(stockDailyRecords); session.getTransaction().commit();
Ausgabe …
Hibernate: insert into exampledb.stock (STOCK_CODE, STOCK_NAME) values (?, ?) Hibernate: insert into exampledb.stock_daily_record (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE) values (?, ?, ?, ?, ?, ?)
Beispiel aktualisieren…
Wenn ein "Stock" -Objekt aktualisiert wird, generiert Hibernate eine SQL-Anweisung.
session.beginTransaction(); Stock stock = (Stock)session.get(Stock.class, 57); StockDailyRecord stockDailyRecords = new StockDailyRecord(); stockDailyRecords.setPriceOpen(new Float("1.2")); stockDailyRecords.setPriceClose(new Float("1.1")); stockDailyRecords.setPriceChange(new Float("10.0")); stockDailyRecords.setVolume(3000000L); stockDailyRecords.setDate(new Date()); stockDailyRecords.setStock(stock); stock.getStockDailyRecords().add(stockDailyRecords); session.save(stockDailyRecords); session.update(stock); session.getTransaction().commit();
Ausgabe…
Hibernate: insert into exampledb.stock_daily_record (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE) values (?, ?, ?, ?, ?, ?)
inverse vs cascade
Viele Leute vergleichen gerne zwischen Invers und Kaskade, aber beide sind völlig unterschiedliche Begriffe, siehedifferential here.
Fazit
Das Verständnis der Umkehrung ist für die Optimierung Ihres Ruhezustands-Codes von entscheidender Bedeutung. Es hilft dabei, viele unnötige Aktualisierungsanweisungen zu vermeiden, z. Versuchen Sie sich zuletzt an die Umkehrung zu erinnern = "wahr" bedeutet, dass dies der Eigentümer der Beziehung ist, der die Beziehung handhabt.