2017-05-10 1 views
1

Ich fand, dass ich die Entity immer noch betreiben könnte, wenn ich sie behalte, z. Setzen Sie die ID des vorherigen Blocks in die priorId des aktuellen Blocks, hier ist der Code.Was passierte, wenn ich persist() in jPA verwende

ArticleService.class

public void createArticle(Article article, List<Block> blocks) throws Exception { 

    ... 

    //check blocks 
    if (!blocks.isEmpty()) { 
     article.setBlocks(blocks); 
     articleDAO.create(article); 
     //here is the question, after persisting I can still operate it. 
     article.setBlocks(BlockUtil.setPriorId(blocks)); 
    } else { 
     throw new Exception("blocks must be set"); 
    } 

    ... 

} 

ArticleDAO.class

public void create(Article article) { 
    em.persist(article); 
} 

BlockUtil.class

public static List<Block> setPriorId(List<Block> blocks) { 

    List<Block> resultBlocks = new ArrayList<>(); 
    if (!blocks.isEmpty()) { 
     resultBlocks.add(blocks.get(0)); 
     for (int i = 1; i < blocks.size(); i++) { 
      blocks.get(i).setPriorId(blocks.get(i - 1).getId()); 
      resultBlocks.add(blocks.get(i)); 
     } 
    } 
    return resultBlocks; 
} 

So etwa ich bin verwirrt, was passiert, wenn ich eine Einheit bestehen bleiben. Ich denke, es ist nicht in der Datenbank gespeichert, oder? Vielleicht wird es immer noch von EntityManager verwaltet, aber warum kann ich die ID bekommen? Ich danke dir sehr!

+0

Verstehen Sie Ihre Frage nicht. Es ist einfach eine Objektinstanz, so dass Sie natürlich auf seine Felder/Methoden zugreifen können. Was ist das Problem hier? –

+0

Was ist passiert, als Sie im Protokoll der JPA-Anbieter nachgesehen haben, um es zu verstehen? aka Debugging –

Antwort

2

Der EntityManager merkt sich alle Entitäten, die an die Sitzung angehängt sind (ob Sie die Entität aus der Datenbank lesen oder eine neue Person beibehalten). Alle Änderungen an diesen angehängten Entitäten werden am Ende der Transaktion in der Datenbank aktualisiert. Im Grunde wird am Ende der Transaktion (oder genauer gesagt jedes Mal, wenn ein "Flush" auftritt) eine "Dirty Check" für jede angehängte Entität durchgeführt. Alle "schmutzigen" Entitäten (diejenigen, die einen anderen Status in der Java-Laufzeit haben) als das, was in der Datenbank in Updates in der Datenbank) gespeichert ist, führen

1

in JPA Ihr Unternehmen zwei Zustände hat.

  • Managed Zustand
  • Freistehendes Zustand

Wenn Sie anhalten Einheit geht es zu verwaltet Zustand. Zum Beispiel, wenn Sie verschmelzen. Das Objekt im Parameter bleibt abgelöst aber zurückgegebene Objekt von merge Funktion ist verwaltet.

Verwalteter Zustand bedeutet, dass Ihre EntityManager die Objekte in seinem Persistenzkontext behält. Und wenn Sie die Transaktion festschreiben, speichert sie alle Objekte in seinem Kontext in der Datenbank. Alle Änderungen an verwalteten Objekten innerhalb der Transaktion werden am Ende in der Datenbank gespeichert.

Wenn Sie Objekt in der Datenbank vor dem Festschreiben speichern müssen, können Sie es über flush Methode tun. Aber bedenke alle Konsequenzen.

0

Lebenszyklus eines Entity

Entity-Instanzen verwaltet von Operationen auf die Entität unter Verwendung eines EntityManager-Instanz, (EntityManager em) Anwendung. Entity-Instanzen in einer von vier Zuständen: neue, verwalten, freistehend oder entfernt:

  • Neue Entitätsinstanzen haben keine persistente Identität und noch nicht mit einem Persistenz-Kontext verbunden.
  • Verwaltete Entitätsinstanzen haben eine persistente Identität und sind einem Persistenzkontext zugeordnet.
  • Detached Entity-Instanzen haben eine persistente Identität und sind derzeit keinem Persistenzkontext zugeordnet.
  • Entfernte Entitätsinstanzen haben eine persistente Identität, sind einem persistenten Kontext zugeordnet und werden aus dem Datenspeicher entfernt.

Persisting Entities - speichern zu Datenbank

New Entitätsinstanzen verwaltet werden und daher persistent, entweder durch die persist Methode aufgerufen oder durch eine Kaskadierung bestehen Betrieb von verbundenen Unternehmen aufgerufen, die die Kaskade haben = PERSIST oder cascade = ALLE Elemente, die in der Beziehungsanmerkung festgelegt wurden.

Warum kaskadierende Einheiten?

In relationalen Datenbanken verweist eine Fremdschlüsselspalte in einer Tabelle auf einen Primärschlüssel in einer anderen Datenbanktabelle. Wenn Sie die Entität (DB-Record) mit der Primärnummer '4233455' aus der Tabelle 'Customers' entfernen, wird sich die Entität in der Tabelle CustomerAddress mit ihrem Fremdschlüsselfeld CustomerId (bezogen auf '4233455') darauf beziehen zu einer Entität, die nicht mehr existiert.

Um konsistente Referenzbeziehungen zwischen Tabellen in Ihrer relationalen Datenbank sicherzustellen, wurde der Begriff der Tabellenkaskadierung definiert. Dies bedeutet, dass die Daten der Entität in der Datenbank gespeichert werden, wenn die mit der Persist-Operation verknüpfte Transaktion abgeschlossen ist ("Commit"). Wenn die Entität bereits verwaltet wird, wird die persistente Operation ignoriert, obwohl die persistente Operation auf verknüpfte Entitäten kaskadiert, für die in der Beziehungsanmerkung das Kaskadenelement auf PERSIST oder ALL gesetzt ist.

Wenn Persist für eine entfernte Entitätsinstanz aufgerufen wird, wird die Entität verwaltet. Wenn die Entität getrennt ist, wird entweder persistent eine IllegalArgumentException auslösen, oder das Transaktions-Commit schlägt fehl (was zu einem Transaktions-Rollback führen kann, wenn dies durch Ihre Persistenzkonfiguration festgelegt wurde).

Persistence cache

Relationale Datenbanken Cache-Einheiten im Speicher. Abhängig davon, welche relationale Datenbank verwendet wird, kann die em-Operation em.flush() erforderlich sein, um sicherzustellen, dass die Daten auf der Festplatte (oder im permanenten Speicher einer In-Memory-Datenbank) gespeichert wurden.

Verwandte Themen