inverse = "true" Beispiel und Erklärung

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.

one to many relationship

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 Set stockDailyRecords =
                        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.