2009-09-08 9 views
1

Dans ma base de données Oracle, j'ai une table appelée PERSON avec le code des colonnes, le nom de famille, le prénom.Pourquoi la chaîne "" est-elle lue comme NULL lors du mappage de la base de données vers un objet à l'aide d'ibatis?

par ex. 'PER001', '________________', 'Bob' (NOTE: _ = espace)

Le nom de famille est défini sur NOT NULL mais vous pouvez entrer une chaîne d'espaces comme "".

J'ai un problème avec ça car quand Ibatis mappe cette colonne à un objet, elle est mappée comme NULL! quand il devrait être mappé comme ""?

Des idées?

+0

Est-ce VARCHAR2 ou CHAR? (Il y a toutes sortes de problèmes de taille avec CHAR) – Thilo

+0

Mieux que de changer le titre avec [RESOLU], marquer une réponse comme acceptée. –

+0

NOM DE FAMILLE NOT NULL VARCHAR2 (40) =] (merci, mon problème est résolu maintenant) – bob

Répondre

0

C'est l'un des caprices d'Oracle de traiter les chaînes vides comme NULL. Ceci est controversé dans certains milieux (en essayant de googler sur http://www.google.co.uk/search?q=oracle+null+ "vide + chaîne"). Oracle peut changer ce comportement à l'avenir. Ne retenez pas votre souffle.

Modifier

Comme il a été souligné, ce n'est pas une chaîne vide, il est une chaîne de blancs. Eh bien, dans ce cas, ce n'est pas Oracle lui-même.

SQL> desc emp 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
EMPNO          NOT NULL NUMBER(4) 
ENAME          NOT NULL VARCHAR2(10) 
JOB            VARCHAR2(9) 
MGR            NUMBER(4) 
HIREDATE           DATE 
SAL            NUMBER(7,2) 
COMM            NUMBER(7,2) 
DEPTNO            NUMBER(2) 

SQL> insert into emp (empno, ename) values (9999, '  ') 
    2/

1 row created. 


SQL> select length(ename) from emp 
    2 where empno = 9999 
    3/

LENGTH(ENAME) 
------------- 
      6 
SQL> 

coupables possibles sont:

  1. un déclencheur appliquant une TRIM() à la colonne en question (ou un traitement similaire)

  2. Ibatis intervenant d'une certaine façon

+0

Oui, mais ce n'est pas une chaîne vide, c'est une chaîne vide (avec des espaces), ceux-ci ne sont pas traités comme NULL, même par Oracle. – Thilo

+0

Oui, vous avez raison Thilo =] – bob

0

Th évite le problème, mais pourriez-vous choisir une autre chaîne, telle que "-" ou "_" pour indiquer une valeur manquante?

En fonction du traitement d'une chaîne vide différente d'une chaîne vide traitée différemment d'une chaîne vide par toutes les parties de votre pile logicielle, cela semble plutôt risqué.

2

Ok je l'ai compris cela! Je ne m'attendais pas à ce que le setter généré par ibatis coupe la corde! > _>

AVANT:

public void setSURNAME(String SURNAME) { 
    this.SURNAME = SURNAME == null ? null : SURNAME.trim(); 
} 

FIX !:

public void setSURNAME(String SURNAME) { 
    this.SURNAME = SURNAME == null ? null : SURNAME; 
} 

Merci pour l'aide les gars! Désolé> _>!

+0

Et plutôt que de lutter contre la coupe, utilisez autre chose qu'une chaîne vide. – Thilo

+0

vrai, c'est un peu illogique d'avoir des blancs dans des valeurs non nulles et j'ai décidé de garder le code original. J'étais curieux de savoir pourquoi cela se passait bien. Merci. – bob