2010-02-05 12 views
5

Sto costruendo un'applicazione J2SE con EJB3 e un DB Oracle Express Edition.EJB3 - @Column (insertable = "false") domanda

Il mio problema è così: ho impostato un oggetto EntityBean nel mio progetto che corrisponde a una tabella nel DB. La tabella contiene una colonna che non è annullabile e ha un valore predefinito . Tutto quello che voglio è che quando si persistono nuovi dati in questa tabella usando l'EJB, il valore della colonna avrà il suo valore predefinito. Ecco come ho impostato nel progetto:

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

Ho anche impostato nel file orm.xml:

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

Ma per qualche ragione, quando si crea un nuovo EntityBean e non fissando il primo nome campo, e poi cercando di persistere, ottengo la seguente eccezione:

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") 

il che significa che il gestore di persistenza tenta di inserire il primo campo del nome, anche se ho detto che non.

Sto facendo qualcosa di sbagliato qui?

Grazie!

risposta

0

Puoi provare senza @Basic(optional = true), perché that maps a NULLABLE (che sembra essere sbagliato nel tuo caso)?

Definisce se il valore del campo o della proprietà può essere nullo.

1

Con le seguenti annotazioni:

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

La colonna FIRST_NAME dovrebbe sicuramente essere ignorato durante la generazione inserti SQL. In altre parole, questo sembra un bug in TopLink Essentials sviluppato nella comunità GlassFish. In realtà, penso che questo problema sia riportato in Issue #627 ("Annotazione colonna insertable = false funziona solo se utilizzato con updatable = false"). Purtroppo, non è fisso in modo da suggerirei:

  • da usare private String m_firstName = "my database default"; (sì, questo è brutto) - O -
  • per cambiare il provider di persistenza (per OpenJPA, Hibenate)
1

prova ad aggiungere qualcosa di simile alla tua classe di entità. Ciò significa escludere i valori di proprietà nulli nel di Hibernate SQL

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


} 
1

TopLink Essentials ometterà solo la colonna se avete sia inseribile e aggiornabile = false.

Questo problema è stato risolto in EclipseLink, quindi è necessario considerare l'aggiornamento.

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