EntityManager.finden Sie nicht finden können, Entität, sondern anhand der Kriterien API
Den ich gestoßen bin einen etwas ungewöhnlichen Fall, der in Java EE 6, wo mit dem JPA EntityManager ist find
- Methode zusammen mit einer Entität primär-id null zurückgibt, sondern anhand der Kriterien-API, um alle Elemente auszuwählen, die mit dieser id funktioniert einwandfrei.
Hier ist der code, den ich verwende für find
:
//Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);
...und hier ist der code, den ich verwende, der die Kriterien API:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> u = criteria.from(User.class);
TypedQuery<User> query = em.createQuery(
criteria.select(u).where(builder.equal(u.get("id"), userId)));
user = query.getSingleResult();
Jede Idee, warum find
gibt null zurück, sondern Kriterien findet der Nutzer? Ich habe versucht, diese zwei Alternative Methoden in der exakt gleichen Stelle im Programm.
Hier sind die relevanten Teile der Entität " Benutzer:
@Entity
@Table(name = "USERS")
@Access(AccessType.PROPERTY)
public class User implements Serializable {
...
private Long id;
...
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_generator")
@SequenceGenerator(name = "user_id_generator", sequenceName = "user_sequence", allocationSize = 1)
@Column(name="id")
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
...
}
- Nicht sicher, ob dies einen Unterschied macht, aber die userId ist eine Lange-oder vielleicht eine ganze Zahl im code?
- Es ist ein Langer, ich doppelt überprüft, dass.
- Ich habe gerade erlebt, dieses Problem mit Hibernate 4.1.8.Final
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich herausgefunden, das problem. Es wurde durch ein Feld in der Datenbank
null
wo es nicht hätte sein sollen zulässig. Dies wurde durch mich Bearbeiten Sie es von hand. Nachdem ich Hinzugefügt ein Wert für das Feld, das problem ging Weg.Welchen provider verwenden Sie?
Wo sind Sie Sie diese finden, in eine oder aus einer Transaktion? Sind Sie Spül-und clearing die EM vor der finden?
Verwendung von EclipseLink als Anbieter, und mein eigenes ähnliches Modell, ich bin nicht in der Lage zu reproduzieren.
Vorausgesetzt, Ihr provider kann die log-SQL, werden Sie sehen SQL gehen, um die DB auf den finden? Was bedeutet das SQL Aussehen, und er führt ordnungsgemäß in SQL-Plus etc...
@Stateless
EJB. Die EM ist verziert mit einem@PersistanceContext(unitName = "xxx_persistence")
. Ich werde beziehen sich auf die SQL-logs und sehen, was ich finden kann.Bestätige ich die Lösung. Das gleiche passierte mir. Ich hatte collumns gekennzeichnet
NOT NULL
, dann während der Prüfung in meine app wechselte ich die Einschränkung aus, die in der Datenbank für zwei collumns (Fremdschlüssel), nicht jedoch die änderung der (optional = false
) Attribut@ManyToOne
Beziehung in meine entity-Klasse. Nachdem Sie das Attribut löschen, so wurde das Modell mit der Datenbank konsistent ist, alles begann zu funktionieren.Seltsam, dass die Umwelt nicht zu einer Warnung oder Ausnahme von einer Art ist.
Überprüfen Sie, ob Sie auf der Durchreise sind eine
Long
im folgenden Codeausschnitt gezeigt:Wenn das nicht hilft, aktivieren Sie die SQL-Protokollierung, um zu sehen, was passiert ist und vergleichen Sie das Verhalten in beiden Fällen.
Ein Grund dafür könnte sein, dass die "id" - Feld nicht korrekt gekennzeichnet, wie die id für die Benutzer-Entität.
Als sanity-check Debuggen von code, die Zeit nehmen, vor dem ausführen der Suche zum ausführen einer manuellen Abfrage auf die Datenbank selbst, um sicherzustellen, dass eine geeignete Benutzer-Datensatz vorhanden ist, mit der id, die Sie erwarten.
Wenn es nicht in der Datenbank, sicherstellen, dass der entity manager wurde gespült oder die aktuelle Transaktion ein commit ausgeführt wurde.
Zum Beispiel, wenn Sie mit Hibernate als provider ist es möglich, dass das Objekt "permanenten" nur im cache und die änderungen haben nicht wirklich vorangetrieben wurde, um die Datenbank. Entsprechend werden die Kriterien gehen über Hibernate-Implementierung wird das Objekt abrufen können, aber der entity-manager finden nicht in der Lage zu finden das Objekt.