2012-07-11 26 views
5

estoy tratando de almacenar nulo valor de un enumerado atributo de una entidad en Java a Oracle base de datos utilizando JPA TopLink. El código se ejecuta sin excepción ni advertencia, pero la entidad no se almacena en la base de datos.¿Es posible almacenar el valor nulo de un atributo enumerado en la base de datos?

La entidad se define como sigue:

@Entity 
public class LetterDoc { 
    ... 
    @Column(name = "delivery_type", columnDefinition = "VARCHAR2(20)", nullable = true) 
    @Enumerated(EnumType.STRING) 
    private DocDeliveryTypeEnum deliveryType; 
    ... 
} 

La clase Enum DocDeliveryTypeEnum tienen valores sólo se requiere.

public enum DocDeliveryTypeEnum { 
    NORMAL, 
    RECOMMENDED, 
    ACKNOWLEDGEMENT 
} 

En mi situación, tengo casos de entidades en las que el TipoAlbaran hace SENCE y es necesario. Sin embargo, en algunos casos, el tipo de entrega es irrelevante y quiero dejarlo nulo. No quiero establecer un valor predeterminado ya que no hay un valor adecuado para este caso.

La instancia de entidad tiene el valor establecido en nulo, pero cuando intento persistir y purgar la instancia en la base de datos, simplemente no se almacena, aunque la columna se define como VARCHAR2 (20) con el valor NULL habilitado.

La situación es algo como esto:

LetterDoc let = new LetterDoc(); 
// settery ostatnich atributu 
let.setDeliveryType(null); 
try { 
    emptyDocDAO.persist(let); 
    emptyDocDAO.flush(); 
} catch (Exception e) { 
    // no exception is really catched :(
    log.error(e); 
} 
// here I have the id of the entity 

Realmente se lanza no es una excepción, mientras que persiste, sólo la entidad no se almacena. Cuando trato de obtener la entidad más tarde en otro hilo por el ID, falla con NoResultException.

¿Hay alguna posibilidad de que esto funcione, o realmente tengo que establecer un valor para todos los atributos enumerados antes de persistir? ¿Realmente tengo que crear un valor predeterminado en la clase Enum?

He resuelto mi problema estableciendo un valor predeterminado que no tiene mucho sentido en la situación particular. Sin embargo, me pregunto si hay alguna otra opción.

Muchas gracias por su experiencia y consejo.

+2

Debería poder guardar nulo en la columna. Muestre el código donde intenta hacerlo y la traza completa de la excepción que obtiene. –

+0

intente esto en su miembro enum: columnDefinition = "char (20) default 'NULL'" – shem

+0

@JBNizet: Realmente no recibo ninguna excepción. Eso es lo que me pregunto más :( – Sharg

Respuesta

1

Sí, puede almacenar nulo para un atributo enum.

No veo cómo podría obtener nada, ¿está ocurriendo una excepción que no está captando?

Habilite el inicio de sesión en el más fino e incluya el registro y su código, y capture las excepciones e incluya el seguimiento de la pila.

+1

Agregué más código para mostrar cómo guardo la entidad.Sin embargo, incluso cuando se captura Exception, no se lanza nada y se atrapa :( – Sharg

0

El código debe arrojar NullPointerException mientras intenta guardar el valor nulo en enumeración. El método Enum.valueOf() arroja NullPointerException si el nombre es nulo.

let.setDeliveryType (null);

Cuestiones relacionadas