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
|