2010-02-05 15 views
5

Estoy construyendo una aplicación J2SE con EJB3 y una base de datos Oracle Express Edition.EJB3 - @Column (insertable = "false") pregunta

Mi problema es el siguiente: configuré un EntityBean en mi proyecto que coincide con una tabla en el DB. La tabla contiene una columna que no admite nulos y tiene un valor predeterminado . Todo lo que quiero es que cuando persista una nueva información en esta tabla usando el EJB, el valor de la columna obtenga su valor predeterminado. Así es como lo fijo en el proyecto:

//holds user's first name 
@Basic(optional = true) 
@Column(name = "FIRST_NAME", insertable = false, updatable = true, nullable = false) 
private String m_firstName; 

también lo fijo en el archivo ORM.XML:

<basic name="firstName"> 
     <column name="FIRST_NAME" insertable="false" updatable="true" nullable="false"/> 
    </basic> 

Pero por alguna razón, cuando se crea un nuevo EntityBean y no se establece el nombre de campo, y luego tratar de persistir, me sale la siguiente excepción:

Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.DatabaseException 
Internal Exception: java.sql.SQLException: ORA-01400: cannot insert NULL into ("TSDB"."USERS"."FIRST_NAME") 

lo que significa que el gestor de persistencia intenta insertar el primer campo de nombre aunque me dijeron que no lo hiciera.

¿Estoy haciendo algo mal aquí?

Gracias!

Respuesta

0

¿Se puede intentar sin @Basic(optional = true), porque that maps a (que parece estar mal en su caso)?

Define si el valor del campo o la propiedad puede ser nulo.

1

Con las siguientes anotaciones:

@Basic(optional = false) 
@Column(name = "FIRST_NAME", insertable = false, updatable = true, nullable = false) 
private String m_firstName; 

La columna FIRST_NAME debe definitivamente ser ignorado cuando se generan insertos de SQL. En otras palabras, esto suena como un error en TopLink Essentials que se desarrolla en la comunidad GlassFish. En realidad, creo que este problema se informa en Issue #627 ("Anotación de columna insertable = falso solo funciona cuando se utiliza con updatable = false"). Lamentablemente, no se fija así que te sugiero:

  • de usar private String m_firstName = "my database default"; (sí, esto es feo) - O -
  • para cambiar el proveedor de persistencia (por OpenJPA, Hibenate)
1

intente agregar algo así a su clase de entidad. Esto significa excluir valores de las propiedades nulos en SQL de la hibernación

@Entity 
@Table(name = "your_table") 
@org.hibernate.annotations.Entity(
    dynamicInsert = true 
) 
public class YourClass{ 


} 
1

TopLink Esencial sólo se omita la columna si tiene tanto insertable y actualizable = false.

Esto se corrigió en EclipseLink, por lo que debería considerar la actualización.

http://www.eclipse.org/eclipselink/