Pregunta

He encontrado un lugar extraño caso en Java EE 6, donde el uso de la JPA EntityManager del find método junto con una entidad primaria id devuelve null, pero el uso de la API de Criterios para seleccionar todas las entidades con las que funciona el identificador de multa.

Este es el código que estoy usando para find:

// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);

...y este es el código que estoy usando con la API de Criterios:

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();

Alguna idea de por qué find devuelve null pero los Criterios encuentra el Usuario?Traté de estos dos métodos alternativos en el mismo lugar en el programa.

Aquí están las partes pertinentes de la entidad Usuario:

@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;
    }
    ...
}
¿Fue útil?

Solución

Me solucionaron el problema.Fue debido a un campo en la base de datos null donde no se debería haber permitido.Esto fue debido a que me editarlo a mano.Después de agregar un valor para ese campo, el problema desapareció.

Otros consejos

¿Qué proveedor está utilizando?

De dónde eres la ejecución de este hallazgo, dentro o fuera de una transacción?Estás lavado y limpieza de la EM antes de la encontrar?

El uso de EclipseLink como proveedor, y mi propio modelo similar, yo no soy capaz de reproducir este.

Suponiendo que su proveedor de registro de SQL, están viendo SQL que va a la base de datos en la encontrar?¿Qué hace el SQL aspecto, y no se ejecutará correctamente en SQL Plus, etc...

Confirmo la solución.Lo mismo me pasó a mí.Me había marcado como collumns NOT NULL, a continuación, durante la prueba en mi aplicación me cambié la limitación de apagado en la base de datos para dos collumns (claves foráneas), sin embargo no cambiar la (optional = false) atributo de @ManyToOne relación en mi clase de entidad.Después de eliminar el atributo, por lo que el modelo era coherente con la base de datos, todo comenzó a funcionar bien.Extraño que el medio ambiente no produce una advertencia o una excepción de algún tipo.

Compruebe que está pasando un Long en el siguiente fragmento de código:

// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);

Si esto no ayuda, activar el inicio de sesión de SQL para ver lo que está sucediendo y comparar el comportamiento en ambos casos.

Una razón puede ser que el campo "id" no ha sido correctamente marcado como el id de la entidad Usuario.

Como una comprobación de validez de la depuración del código, tomando el tiempo necesario antes de ejecutar el buscar para ejecutar un manual de consulta en la base de datos de asegurar un adecuado registro de Usuario con el id que usted espera.

Si no está en la base de datos, asegúrese de que el gerente de la entidad ha sido eliminado o que la transacción actual se ha cometido.

Por ejemplo, si usted está usando Hibernate como el proveedor, es posible que el objeto es "persisted" sólo en la memoria caché y los cambios no han sido empujados a la base de datos.En consecuencia, los criterios que va a través de Hibernación de la implementación de recuperar el objeto, pero el gerente de la entidad encontrar no será capaz de localizar el objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top