3 Stimmen

Warum enthalten verknüpfte Sammlungen Nullwerte? (Hibernate, Annotation, Spring)

(Bearbeiten: Offenbar ist dies nur ein Problem für Arrays und FoxyBOA's Antwort könnte direkt zu (oder sogar ist) die Antwort).

Meine Frage bezieht sich auf diese Software: Hibernate3+Annotation, Spring MVC, MySQL und in diesem Beispiel auch Spring Security.

Ich habe mich gefragt, warum Sammlungen, die automatisch von Hibernate verknüpft werden, Nullwerte für jede Zeilennummer der untergeordneten Tabelle enthalten (neben den Elementen, die korrekt sind). Mein Beispiel:

Ich habe eine Benutzer und ein Behörden Tabelle, der Primärschlüssel der Benutzer Tabelle ist Nutzername der als Fremdschlüssel dient. Im Moment gibt es 13 Zeilen in meinem Behörden Tisch. Wenn ich einen Benutzer aus der Datenbank (MySQL InnoDB) abrufe, ruft Hibernate automatisch die Behörden des Benutzers ab, die dieser Zuordnung entsprechen:

@OneToMany
@JoinColumn(name = "username")
@IndexColumn(name="id") // "id" was the primary key and is used to sort the elements
public Authority[] getAuthorities() {
    return authorities;
}
public void setAuthorities(Authority[] authorities) {
    this.authorities = authorities;
}

... Am Ende habe ich eine Sammlung "Behörden" mit 14 (0-13) Elementen, von denen nur vier nicht-null sind (vier Zeilen in der Datenbanktabelle gehören zu diesem speziellen Benutzer, das ist also korrekt). Soweit ich weiß, verwende ich Hibernate-Standardwerte für Eigenschaften wie Fetchmode usw. Ich erhalte den Benutzer auf diese Weise:

Criteria criteria = getSession().createCriteria(User.class);
criteria.add(Restrictions.eq("username",username));
User user = (User) criteria.uniqueResult();

Die Protokollierungsinformationen von org.hibernate.loader.loader "erwähnen" korrekt vier Zeilen für die Ergebnismenge. Dennoch hat der erstellte Benutzer die vier richtigen Elemente plus zehn Nullwerte im Array. In meinem konkreten Beispiel führt dies zu dieser Ausnahme:

java.lang.IllegalArgumentException: Granted authority element 0 is null - GrantedAuthority[] cannot contain any null elements

3voto

Gareth Davis Punkte 27204

Die Antwort liegt in der @IndexColumn-Anmerkung. Sie verwendet den Wert von id als Array-Index, d. h. die Anzahl der Elemente im Array entspricht im Wesentlichen dem Wert der höchsten ID in der Tabelle der Behörden.

siehe die hibernate-Dokumentation zu indizierten Sammlungen

Versuchen Sie, den Vermerk zu entfernen.

Auch nur als ein Gedanke; haben Sie in Betracht gezogen, ein Set für die Zuordnung zu verwenden? es ist nicht unbedingt notwendig, es ist nur ein bisschen mehr gemeinsame Form der Zuordnung, das ist alles.

2voto

FoxyBOA Punkte 5762

Ich kann Ihnen empfehlen, Ihre Daten zu überprüfen. Wenn Sie einen fehlenden Index haben (in Ihrem Fall die Spalte id), dann erhalten Sie statt der fehlenden id eine Null in Ihrem Array. I.e.

table authorities:
username id
bob 1
bob 3
bob 5

Als Ergebnis erhalten Sie ein Array: {0=null, 1=bob, 2=null, 3=bob, 4=null, 5=bob}

UPDATE : Ich habe die Situation in zwei Fällen erlebt:

  1. Fehlende Schlüsselwerte in indizierter Spalte id unter Behörden Tabelle (z.B. 0,1,3,4,5 - fehlender Wert 2. Hibernate fügt automatisch einen Array-Wert mit Schlüssel 2 und Wert Null hinzu).
  2. Indizierte Werte sind in Ordnung, aber Select-Kriterien filtern einen Teil von ihnen (z.B. Ihre HQL ähnlich dem "from user u join u.authorities a where a.id=2". In diesem Fall lädt Hibernate einen Benutzer, aber im Behörden-Array werden Sie nur 3 Werte haben: 0 - null, 1 - null, 2 - Behörde mit id 2).

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