-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Update/unsaved-value pb du a 1 custom type ?
PostPosted: Wed May 04, 2011 3:31 am 
Newbie

Joined: Mon May 02, 2011 10:46 am
Posts: 9
Bonjour,

1/ j'ai une table CONTACT_INFO avec la colonne
ADDITIONAL_EMAIL qui contiendra des adresses mail
séparées par des points-virgules;

2/ le pojo sur lequel cette table est mappée possède
les set- getters suivants:
~ public class ContactInfo {...
~ public java.lang.String[] getAdditionalEMail()
~ {
~ int size = _additionalEMailList.size();
~ java.lang.String[] mArray = new java.lang.String[size];
~ for (int index = 0; index < size; index++) {
~ mArray[index] = (String)_additionalEMailList.get(index);
~ }
~ return mArray;
~ }
~ ...
~ public void setAdditionalEMail(java.lang.String[] additionalEMailArray)
~ {
~ //-- copy array
~ _additionalEMailList.clear();
~ for (int i = 0; i < additionalEMailArray.length; i++) {
~ _additionalEMailList.add(additionalEMailArray[i]);
~ }
~ }

qui résulte d'une génération à partir d'une XSD avec Castor
(je ne peux rien changer à cette classe)

3/ c'est mappé de la façon suivante:
~ <property name="additionalEMail"
~ type="my.pkg.usertypes.CustomStringToStringArrayType" column="ADDITIONAL_EMAIL" length="400" />

et la PK de cette table est définie comme suit

~ <id name="id" type="int">
~ <column name="ID" precision="10" scale="0" />
~ <generator class="assigned" />
~ </id>

(la valeur vient d'une séquence gérée avec un trigger)

4/ dans la classe custom-type les nullSafeGet/Set's sont:

~ public Object nullSafeGet(ResultSet inResultSet, String[] names, Object o)
~ throws HibernateException, SQLException {
~ String val = (String)Hibernate.STRING.nullSafeGet(inResultSet, names[0]);
~ if (val == null) {
~ String empty[] = new String[0];
~ return empty;
~ } else {
~ String result = val.replaceAll(" ", "");
~ return result.split(";");
~ }
~ }
~
~ public void nullSafeSet(
~ PreparedStatement inPreparedStatement,
~ Object o, int i) throws HibernateException, SQLException {
~
~ String val[] = (String[])o;
~
~ if (val != null && val.length>0)
~ {
~ StringBuffer result = new StringBuffer();
~ int len = val.length;
~ for (int j=0; j<len; j++)
~ if (j == len-1)
~ result.append(val[j]);
~ else
~ result.append(val[j]+";");
~ inPreparedStatement.setString(i, result.toString());
~
~ }else{
~ inPreparedStatement.setString(i, "");
~ }
~ }

5/ Je ne peux pas changer quoi que ce soit à ce String array dans
le pojo;

6/ une update marche perfectly, le probleme c'survient quand
j'insère une nouvelle row dans ma table, je reçois l'erreur
"Row was updated or deleted by another transaction (or unsaved-value
mapping was incorrect)", j'ai remarqué qu'Hibernate fait un insert,
puis immédiatement après essaie un update (et l'exception renvoie
le détail suivant: ContactInfo#0);

7/ si je supprime la ligne de mapping
~ <property name="additionalEMail"
~ type="my.pkg.usertypes.CustomStringToStringArrayType" ...

tout marche impeccable (c'est donc bien ce custome type qui provoque
l'exception)

8/ l'erreur survient tout le temps, même quand le string array
ContactInfo.additionalEmail est vide (quand je ne sette rien du tout)
il semble que la ligne de mapping ci-dessus fait que Hibernate déclenche
un update même s'il n'y a pas de données 'additional email': est-ce que
le code ci-dessus (§4) pourrait être à l'origine de cet update ?

9/ Dans mon DAO je fais:
~ ContactInfo contactInfo = new ContactInfo();
~ contactInfo.setParentId(parentId.intValue());
~ contactInfo.setLastUpdateDate(new Date());
~ session.save(contactInfo);
~ contact.addContactInfo(contactInfo);
~ ...
puis
~ session.flush(); <= ce qui cause l'exception

J'ai essayé d'ajouter
~ session.save(contact);
ou
~ session.saveOrUpdate(contactInfo);
juste après "session.save(contactInfo);" et de jouer aussi avec différentes
valeurs de l'attribut 'unsaved-value' du contactInfo.ID dans le mapping, mais
sans succès...

Quelqu'un peut-il m'aider svp ?? Jamais rencontré problème similaire ?

Merci mille fois !
Salutations,
Seb


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.