2010-02-05 22 views
5

Je construis une application J2SE avec EJB3 et une base de données Oracle Express Edition.EJB3 - @Column (insérable = "false") question

Mon problème est comme ça - Je définis un EntityBean dans mon projet qui correspond à une table dans la base de données. La table contient une colonne qui n'est pas Nullable et a une valeur par défaut . Tout ce que je veux, c'est que lors de la persistance d'une nouvelle donnée à cette table en utilisant l'EJB, la valeur de la colonne aura sa valeur par défaut. Voici comment je l'ai mis dans le projet:

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

Je l'ai mis aussi dans le fichier orm.xml:

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

Mais pour une raison quelconque, lors de la création d'une nouvelle EntityBean et ne fixant pas la première nom du champ, puis essayer de persister, je reçois l'exception suivante:

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

ce qui signifie que le gestionnaire de persistance tente d'insérer le premier champ de nom mais je dis que ce ne pas.

Est-ce que je fais quelque chose de mal ici?

Merci!

Répondre

0

Pouvez-vous essayer sans @Basic(optional = true), parce que that maps à NULLABLE (ce qui semble être faux dans votre cas)?

Définit si la valeur du champ ou de la propriété peut être nulle.

1

Avec les annotations suivantes:

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

La colonne FIRST_NAME devrait certainement être ignoré lors de la génération des inserts SQL. En d'autres termes, cela ressemble à un bug dans TopLink Essentials qui est développé dans la communauté GlassFish. En fait, je pense que ce problème est signalé dans Issue #627 ("L'annotation de colonne insertable = false ne fonctionne que si elle est utilisée avec updatable = false"). Malheureusement, il ne fixe donc je vous suggère:

  • à utiliser private String m_firstName = "my database default"; (oui, ce qui est laid) - OU -
  • pour changer le fournisseur de persistance (pour OpenJPA, Hibenate)
1

essayez d'ajouter quelque chose comme ça à votre classe d'entité. Cela signifie exclure la valeur des propriétés null dans SQL

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


} 
1

TopLink Essentials de la mise en veille prolongée n'omettra la colonne si vous avez à la fois insérables et actualisable = false.

Cela a été corrigé dans EclipseLink, vous devriez donc envisager une mise à niveau.

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