2010-05-17 7 views
25

Ich bin mit Hibernate und„Keine Zeile mit der angegebenen Kennung vorhanden ist“, obwohl es vorhanden ist

Exception in thread „main“ org.hibernate.ObjectNotFoundException bekommen: keine Zeile mit der angegebenen Kennung vorhanden ist: [# 271]

Was an diesem Fehler ziemlich seltsam ist, ist, dass das Objekt mit der angegebenen ID in der Datenbank existiert. Ich habe den problematischen Datensatz in einem anderen Lauf der Anwendung eingefügt. Wenn ich darauf im selben Lauf (d. H. Dieselbe Hibernate-Sitzung) zugreife, scheint es keine Probleme beim Abrufen der Daten zu geben.

Nur weil es ein Fehler der Abbildung sein könnte:

public class ProblemClass implements Persistent { 
    @ManyToOne(optional = false) 
    private MyDbObject myDbObject; 
} 
public class MyDbObject implements Persistent { 
    @OneToMany(mappedBy = "myDbObject") 
    private List<ProblemClass> problemClasses; 
    @ManyToOne(optional = false) 
    private ThirdClass thirdClass; 
} 

Ich habe absolut keine Ahnung, selbst wenn sie an zu suchen. Alle Hinweise sehr geschätzt!

Nur zur Verdeutlichung: Die Daten wurden in einem anderen RUN der Anwendung eingefügt. Es ist definitiv in der Datenbank, wie ich es über eine SQL-Abfrage nach dem Beenden der Anwendung sehen kann. Und nach dem, d. H. Wenn ich die Anwendung erneut starte, bekomme ich den Fehler in der ersten Abfrage der Datenbank - keine Löschung, kein Rollback beteiligt.

Zusatz: Weil es wurde gefragt, hier ist der Code, um die Daten zu holen:

public List<ProblemClass> getProblemClasses() { 
    Query query = session.createQuery("from ProblemClass"); 
    return query.list(); 
} 

Und es vollständig nur zu machen, hier der allgemeine Code ist es einzufügen (vor in einem anderen RUN des Abrufen die Anwendung):

public void save(Persistent persistent) { 
    session.saveOrUpdate(persistent); 
} 

Antwort

21

Eureka, ich fand es!

Das Problem war folgendes:

Die Daten in der Tabelle ThirdClass wurde nicht korrekt beibehalten. Da diese Daten aus MyDbObject über

optional = false 

verwiesen wurde gemacht Hibernate eine innere Verknüpfung, also ein leeres Ergebnis für die Verbindung zurück. Da die Daten dort waren, wenn sie in einer Sitzung (im Cache, denke ich) ausgeführt wurden, machte das keine Probleme.

MySQL erzwingt die Integrität des Fremdschlüssels nicht und beschwert sich daher nicht beim Einfügen beschädigter Daten.

Lösung: optional = richtige oder korrekte Einfügung der Daten.

+7

Verwenden Sie InnoDB-Tabellen ... –

+0

Vielen Dank für die Antwort! – Lisa

2

Klingt Transaktion Einfügen

+0

Entschuldigung wegen Unklarheit: Die Daten wurden in einem anderen RUN der Anwendung eingefügt. Es ist definitiv in der Datenbank, wie ich es über eine SQL-Abfrage nach dem Beenden der Anwendung sehen kann. Und nach dem bekomme ich den Fehler in der ersten Abfrage der Datenbank. – roesslerj

5

Mögliche Gründe rollbacked ist:

  1. Die Zeile wurde von der ersten Sitzung eingefügt, aber die Transaktion wurde nicht ausgeführt, als die zweite Sitzung versuchte, darauf zuzugreifen.
  2. Die erste Sitzung wird aus irgendeinem Grund zurückgesetzt.
+0

Es tut uns auch leid, dass es unklar ist: Die Daten wurden in einen anderen RUN der Anwendung eingefügt. Es ist definitiv in der Datenbank, wie ich es über eine SQL-Abfrage nach dem Beenden der Anwendung sehen kann. Und nach dem bekomme ich den Fehler in der ersten Abfrage der Datenbank. – roesslerj

0

Bitte aktualisieren Sie Ihre hibernate Konfigurationsdatei wie unten angegeben:

property start tag name="hbm2ddl.auto" create/update property close tag 
1

dies der Fall sein könnte, bitten wir auf einem anderen Beitrag meine Antwort überprüfen.

https://stackoverflow.com/a/40513787/6234057

hatte ich die gleiche Hibernate Ausnahme.

Nach dem Debuggen für einige Zeit erkannte ich, dass das Problem durch die verwaisten Kind Datensätze verursacht wird.

Wie viele sich beschweren, wenn sie den Datensatz suchen, existiert es. Was ich erkannte, ist, dass das Problem nicht wegen der Existenz des Datensatzes, sondern Hibernate nicht in der Tabelle zu finden ist, sondern aufgrund der verwaisten Kind Datensätze.

Die Datensätze, die sich auf die nicht vorhandenen Eltern beziehen!

Was ich getan habe ist, finden Sie die Fremdschlüssel Referenzen entsprechend der Tabelle mit der Bean verbunden.

Um Fremdschlüssel-Referenzen in SQL Entwickler

1.Save die folgenden XML-Code in einer Datei (fk_reference.xml)

<items> 
<item type="editor" node="TableNode" vertical="true"> 
<title><![CDATA[FK References]]></title> 
<query> 
    <sql> 
     <![CDATA[select a.owner, 
         a.table_name, 
         a.constraint_name, 
         a.status 
       from all_constraints a 
       where a.constraint_type = 'R' 
         and exists(
          select 1 
          from all_constraints 
          where constraint_name=a.r_constraint_name 
            and constraint_type in ('P', 'U') 
            and table_name = :OBJECT_NAME 
            and owner = :OBJECT_OWNER) 
          order by table_name, constraint_name]]> 
    </sql> 
</query> 
</item> 

2.Add der BENUTZERDEF zu finden Erweiterung zu SQL Developer

Um die Orphan Datensätze in allen zu finden genannten Tabellen

select * from CHILD_TABLE wo foreignKey nicht in (wählen primaryKey von PARENT_TABLE) ;

diese Orphan Datensätze löschen, die Änderungen Commit und den Server neu starten, falls erforderlich.

Dies löste meine Ausnahme. Sie können das gleiche versuchen.

2

Hauptgrund für dieses Problem ist es, Daten Mismatch, beispielsweise i Entitätszuordnung Klasse bezeichnet „X“ haben und es hat Spalte „column1“ und dessen Bezug auf die Tabelle „Y“ Spalte „column1“, wie nachstehend

hat
@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "column1", referencedColumnName = "column1") 
public Y getColumn1() { 
    return Y; 
} 

In diesem wenn X-Tabelle Spalte1 hat Wert aber Y-Tabelle Spalte1 hat nicht den Wert. Hier wird die Verbindung fehlschlagen.

Dies ist der Grund, warum wir Hibernate ObjectNotFound Ausnahme

Dieses Problem durch die Schaffung von geeignetem Datenmodell aufgelöst werden kann auch, wie das Erstellen Indexierung und Einschränkungen (Primärschlüssel/Fremdschlüssel) ..

0

bekommen Ich habe festgestellt, dass in Oracle dieses Problem auch durch ein Berechtigungsproblem verursacht werden kann. Die ProblemClass-Instanz, auf die die MyDbObject-Instanz verweist, ist zwar vorhanden, verfügt jedoch über Berechtigungen, die es dem aktuellen Benutzer nicht ermöglichen, sie zu sehen, obwohl der Benutzer das aktuelle MyDbObject sehen kann.

Verwandte Themen