it-swarm.com.de

org.hibernate.ObjectNotFoundException: Es ist keine Zeile mit dem angegebenen Bezeichner vorhanden, aber DOES

Ich habe ein Problem mit dem Ruhezustand, das ich nicht beheben kann.

Das Setup: Java EE, Web-App, Hibernate 3.2, Tomcat 6, Struts 2.

Grundsätzlich bleibe ich ein Objekt mit meiner Serverlogik (eine Struts-Aktion), versuche dann, diese Daten für die nächste Seite herauszuholen und anzuzeigen.

Ich überprüfe die Datenbank, nachdem ich das Objekt gespeichert habe, und ich kann die Zeile dort mit allen Daten sehen.

Aber wenn ich es versuche, es zu bekommen, bekomme ich Folgendes:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [msc.model.Picture#73]

Um die Sache noch unübersichtlicher zu gestalten, wenn ich Tomcat neu starte und auf dasselbe Objekt zugreifen möchte, erhalte ich keine Fehlermeldung - Hibernate findet die Zeile gut.

Hibernate kann die Zeile auch sehen, wenn ich andere Operationen durchführe. Fügen Sie der Datenbank hier und da eine Zeile hinzu, nicht einmal in derselben Tabelle.

Ich vermute von all dem einen Hibernate-Bug, aber ich bin ein Hibernate-Neuling, also bin ich wahrscheinlich falsch. Bitte helfen Ich habe gegoogelt und gegoogelt.

Hier ist meine Hibernate-Konfiguration:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/msc</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">-------</property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">80</property>
        <property name="current_session_context_class">thread</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <mapping resource="msc/model/Picture.hbm.xml"/>
        <mapping resource="msc/model/Comment.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Hier sind meine zwei Mapping-Dateien:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="msc.model.Picture" table="PICTURE">
    <id column="PICTURE_ID" name="id">
      <generator class="native"/>
    </id>
    <property name="story"/>
    <property name="email"/>
    <property name="category"/>
    <property name="state"/>
    <property name="ratings"/>
    <property name="views"/>
    <property name="timestamp"/>
    <property name="title"/>
    <property lazy="true" name="image" type="blob">
      <column name="IMAGE"/>
    </property>
    <property lazy="true" name="refinedImage" type="blob">
      <column name="REFINEDIMAGE"/>
    </property>
    <property lazy="true" name="thumbnail" type="blob">
      <column name="THUMBNAIL"/>
    </property>
    <bag cascade="save-update" lazy="true" name="comments" table="COMMENT">
      <key column="PICTURE"/>
      <one-to-many class="msc.model.Comment"/>
    </bag>
  </class>
</hibernate-mapping>

und

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="msc.model.User" table="USER">
    <id column="USER_ID" name="id">
      <generator class="native"/>
    </id>
    <property name="username"/>
    <property name="email"/>
    <bag cascade="save-update" lazy="true" name="pictures" table="PICTURE">
      <key column="USER"/>
      <one-to-many class="msc.model.Picture"/>
    </bag>
    <bag cascade="save-update" lazy="true" name="comments" table="COMMENT">
      <key column="USER"/>
      <one-to-many class="msc.model.Comment"/>
    </bag>
  </class>
</hibernate-mapping>

Bitte lassen Sie es mich wissen, wenn Sie weitere Informationen benötigen.

(Hinweis: Dies ist kein Duplikat dieser Frage. Das Szenario ist nicht dasselbe. "Es existiert keine Zeile mit der angegebenen Kennung", obwohl es ) existiert.

EDIT: Auf Wunsch Java-Code buchen:

Code zum Speichern des Objekts

Session hib_ses = HibernateUtil.getSessionFactory().getCurrentSession();

hib_ses.beginTransaction();

hib_ses.save(user);

hib_ses.getTransaction().commit(); 

Code zum Anzeigen von Daten (in diesem Fall ein Bild)

public class ImageAction extends ActionSupport implements ServletResponseAware, SessionAware {

    private HttpServletResponse response;
    Map session;
    private Long id;
    private int thumbnail;
    private InputStream inputStream;

    @Override
    public String execute() throws Exception {
        response.setContentType("image/jpeg");
        Session hib_session = HibernateUtil.getSessionFactory().getCurrentSession();
        hib_session.beginTransaction();

        //what is the ID now?
        Picture pic = (Picture) hib_session.load(Picture.class, getId());

        if (thumbnail == 1) {
            inputStream = (ByteArrayInputStream) pic.getThumbnail().getBinaryStream();
        } else {
            inputStream = (ByteArrayInputStream) pic.getRefinedImage().getBinaryStream();
        }

        hib_session.close();
        return SUCCESS;
    }
23
nasty pasty

Überprüfen Sie alle Ihre Zuordnungen und Datenbankeinstellungen. Möglicherweise setzen Sie in Fremdschlüsselbeziehungen einige not-null = "true", wenn in Ihrer Datenbank nullable = "true" angegeben ist. Der erste bewirkt einen INNER JOIN und der zweite LEFT JOIN.

Legen Sie die Protokollebene auf TRACE fest, um alle Schritte anzuzeigen, und suchen Sie beim Abrufen der Objekte nach generiertem SQL.

16
Esteve Camps

Dies geschieht, weil Sie etwas eingegeben haben, das ein Fremdschlüssel sein soll, aber nichts referenzieren. Überprüfen Sie Ihre Datenbank, ob der Schlüssel existiert oder nicht (obwohl er in einer Datenbank in anderen Tabellen vorhanden ist).

15
Amit Kumar

Überprüfen Sie einfach Ihre Datenbank, ob in Ihrer Tabelle die ID 73 verfügbar ist oder nicht 

5
Hardik Gajjar

In vielen zu einer Beziehung müssen Sie dem Ruhezustand mitteilen, was zu tun ist, wenn die zugeordnete Zeile nicht gefunden wird. Sie können es auf folgende Arten konfigurieren:

Annotation:
@NotFound(action = NotFoundAction.IGNORE)
Mapping XML:
<many-to-one name="user" column="user_id" class="com.xyz.User" cascade="save-update, evict" not-found="ignore"/>
3
Rakesh

Okay, ich werde hier eine Theorie werfen. Könnte es sein, dass Sie versuchen, das Bild zu laden, wenn vor der Transaktion festgeschrieben wurde?

Da die Transaktion noch nicht festgeschrieben ist, ist die Zeile für die Transaktion, die Sie zum Lesen des Bildes verwenden, nicht sichtbar (abhängig von der Transaktionsisolationsstufe).

Da sich hib_session.close() nicht in einem finally-Block befindet, wird er nicht ausgeführt, und die Thread-gebundene Sitzung hat noch eine offene Transaktion. Die nachfolgende Anforderung erhält die same Hibernate-Sitzung mit derselben offenen Transaktion, und Sie erhalten dasselbe Ergebnis aus den select it-Ausgaben (wiederum abhängig von der Transaktionsisolationsstufe - siehe Dokumentation hier insbesondere für REPEATABLE_READ).

Dies könnte auch erklären, warum flush() etwas besser macht, denn wenn die flush() früher als die commit() auftritt, ist die Wahrscheinlichkeit geringer, dass die Racebedingung auftritt.

Ich schlage vor, Sie versuchen, die Sitzung in einem finally-Block zu schließen und zu sehen, ob sich das Verhalten für nachfolgende Anforderungen ändert.

2
waxwing

Möglicherweise besteht in der gesuchten Entität eine Eins-zu-Eins-Beziehung mit einer anderen ID. Versuchen Sie, die Entität mit der ID in die zugeordnete Tabelle und nicht in die Identitätsspalte zu laden.

0
Jixuan LIU

Ich sehe keine echten Probleme im Zusammenhang mit der Ausnahme im Code. Vielleicht möchten Sie Folgendes versuchen:

  • Überprüfen, ob die Transaktion geleert wird, oder flush() nach dem Festschreiben manuell aufgerufen wird;
  • Überprüfung, ob die ID an load() übergeben wird und ob die richtige ID per Debugger an sie übergeben wird
  • Aktivieren des Ruhezustands zum Drucken der generierten SQL und/oder Aktivieren der Protokollierung
0
TC1

Überprüfen Sie die Trigger. Wenn Sie einen Trigger vor dem Einfügen haben und NEXTVAL in der Sequenz haben, kann dies zu diesem Fehler führen.

0
Carlos UCR

Ich habe ein ähnliches Problem mit Hibernate 3.6.10.

Anmerkung: 

@Entity
public class Familiares {
@OneToMany(mappedBy = "familiares")
private List<FamiliaresBaja> bajas;

@Entity
@Table(name = "familiares_baja")
public class FamiliaresBaja implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @JoinColumn(name = "familiares_id")
    @ManyToOne(optional = false)
    private Familiares familiares;

dann rufe ich eine liste ab und suche mit diesen in FamiliaresBaja ob es mindestens eine gibt.

createQuery("from FamiliaresBaja where familiares.id="+ id).uniqueResult() // should return a single result or null not throw a Exception

Dies muss ein Fehler im Ruhezustand sein

0
FiruzzZ

Bitte überprüfen Sie den Wert von lower_case_table_names Ihres MySQL-Servers. Wenn der Wert 0 ist, überprüfen Sie die von Hibernate generierte SQL. Stellen Sie sicher, dass der Fall des Tabellennamens mit dem tatsächlichen Tabellennamen in mysql übereinstimmt.

0
stinghu

Der richtige Weg, um dieses Problem zu lösen, ist die Verwendung der session.get() -Methode. Die Methode Get gibt null zurück, wenn die Entität nicht gefunden wird.

0
Pritam Patil

Ich stellte mich diesem Problem und hier ist was passiert ist und wie ich es gelöst habe. Wahrscheinlich haben Sie auch das Gleiche.

Ich hatte POST und USER-Objekte. Sie sind in einer OneToMany-Beziehung (Ein Benutzer kann viele Beiträge haben). Indem sie bidirektional gemacht werden, befinden sie sich auch in einer ManyToOne-Beziehung (ein Beitrag gehört nur einem Benutzer).

Nach dem Unterricht aussieht 

@Entity
@Table(name="Post")
public class Post {

@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private long postId;
private String title;
private String body;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "postUserId")
private AutoUser autoUser;
// getter and setters

Benutzerklasse ist 

@Entity
@Table(name = "AUTO_USER")
public class AutoUser implements UserDetails {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long autoUserId;

@Column(name = "USERNAME")
private String username;

@OneToMany
private List<Post> postList = new ArrayList<>();
  // getter and setters

Die ersten Tabellennamen waren "Post" und "AUTO_USER". Ich hatte 3 Benutzer, die an einer AUTO_USER-Tabelle (mit der ID 1, 2, 3) bestanden. Und 3 Einträge für die Tabelle "Post" 1 für jeden Benutzer .. (. Die Join-Spalten oder den Fremdschlüssel) waren 1, 2, 3) 

Dann änderte ich nur den Tabellennamen nur für das Benutzerobjekt und nannte ihn @Table(name = "AUTO_USER2"). und ich hatte in dieser Tabelle nur einen Benutzer mit der ID 1. 

In meinem Code durchlaufe ich jeden Beitrag und identifiziere, welcher Beitrag zu welchem ​​Benutzer gehört, und zeige ihn an, die zum aktuell angemeldeten Benutzer gehören.

Nachdem ich den Namen der Posttabelle geändert hatte, bekam ich diese Ausnahme 

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tadtab.core.authentication.AutoUser#2

Was bedeutet, dass das Benutzerobjekt mit der ID 2 in der neuen Benutzertabelle nicht verfügbar ist.

dann habe ich einen weiteren benutzer mit id 2 registriert und später bekam ich das 

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tadtab.core.authentication.AutoUser#3

Diesmal konnte kein Benutzer mit der ID 3 gefunden werden

Schließlich einen dritten Benutzer registriert und hatte keine Ausnahme.

Wie Sie sehen, ist der Fremdschlüssel in der Post-Tabelle vorhanden. Da ich jedoch die Benutzertabelle geändert habe, könnte es für sie keine Übereinstimmung geben. Dies ist der Grund, warum ich mit diesem Problem konfrontiert wurde.

Um diese Situation zu vermeiden, habe ich neue Tabellennamen für beide Objekte erstellt und neu gestartet 

Hoffe das wird helfen 

0
tadtab