60 Stimmen

Lösen einer Entität aus dem JPA/EJB3-Persistenzkontext

Was wäre der einfachste Weg, eine bestimmte JPA Entity Bean, die über einen EntityManager erworben wurde, zu lösen. Alternativ könnte ich eine Abfrage zurückgeben losgelöst Objekte in den ersten Platz, so dass sie im Wesentlichen als "nur lesen" handeln würde?

Der Grund, warum ich dies tun möchte, ist, weil ich die Daten innerhalb der Bohne ändern möchte - mit in meiner Anwendung nur, aber nicht immer haben es in die Datenbank persistiert. In meinem Programm muss ich schließlich flush() auf dem EntityManager aufrufen, was alle Änderungen von angehängten Entitäten in der Datenbank persistieren würde, aber ich möchte bestimmte Objekte ausschließen.

3voto

James Punkte 18499

Bei Verwendung von EclipseLink haben Sie auch die Möglichkeit,

Verwenden Sie den Abfrage-Hinweis, eclipselink.maintain-cache"="false - werden alle zurückgegebenen Objekte abgetrennt.

Verwenden Sie die EclipseLink JpaEntityManager copy() API, um das Objekt in die gewünschte Tiefe zu kopieren.

1voto

tonygambone Punkte 435

Wenn die Bean nicht allzu viele Eigenschaften hat, können Sie einfach eine neue Instanz erstellen und alle Eigenschaften manuell über die persistierte Bean festlegen.

Dies könnte z. B. als Kopierkonstruktor implementiert werden:

public Thing(Thing oldBean) {
  this.setPropertyOne(oldBean.getPropertyOne());
  // and so on
}

Dann:

Thing newBean = new Thing(oldBean);

1voto

Davide Consonni Punkte 1994

Das ist schnell und schmutzig, aber Sie können das Objekt auch serialisieren und deserialisieren.

1voto

David Faulstich Punkte 11

Da ich SEAM und JPA 1.0 verwende und mein System eine Funktionalität hat, die alle Feldänderungen protokollieren muss, habe ich ein Wertobjekt oder Datenübertragungsobjekt erstellt, wenn dieselben Felder der Entität, die protokolliert werden muss. Der Konstruktor des neuen Pojos ist:

    public DocumentoAntigoDTO(Documento documentoAtual) {
    Method[] metodosDocumento = Documento.class.getMethods();
    for(Method metodo:metodosDocumento){
        if(metodo.getName().contains("get")){
            try {
                Object resultadoInvoke = metodo.invoke(documentoAtual,null);
                Method[] metodosDocumentoAntigo = DocumentoAntigoDTO.class.getMethods();
                for(Method metodoAntigo : metodosDocumentoAntigo){
                    String metodSetName = "set" + metodo.getName().substring(3);
                    if(metodoAntigo.getName().equals(metodSetName)){
                        metodoAntigo.invoke(this, resultadoInvoke);
                    }
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
}

1voto

Chris B Punkte 727

In JPA 1.0 (getestet mit EclipseLink) konnten Sie die Entität außerhalb einer Transaktion abrufen. Mit containerverwalteten Transaktionen könnte man das zum Beispiel tun:

public MyEntity myMethod(long id) {
    final MyEntity myEntity = retrieve(id);
    // myEntity is detached here
}

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public MyEntity retrieve(long id) {
    return entityManager.find(MyEntity.class, id);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X