I encounter a java.lang.StackOverflowError when using the updated CVS.
I'll try to give some details about the context, but I didn't dig very far
in castor code.
Attached is the mapping file.
The code causing the exception is :
DBVersion lo_version = lo_vue.version;
lo_version.setDate(new Date());
//l'entr�e � modifier
DBEntree lo_entree = null;
DBEntree lo_entreeTemporaire = getEntreeTemporaire();
try {
Database lo_db = jdo.getDatabase();
lo_db.setAutoStore(true);
try {
log.debug("\t<transaction>");
lo_db.begin();
log.debug("\t\t<cr�ation de " + lo_entree + ">");
//inclusion de la cat�gorie dans la transaction
lo_entree = (DBEntree) lo_db.load(DBEntree.class,
lo_vue.idObjetPrincipal);
if (lo_vue.direct) {
//�changer les donn�es entre l'entr�e et la version
String lo_tmp;
lo_tmp = lo_entree.getDescription();
lo_entree.setDescription(lo_version.getDescription());
lo_version.setDescription(lo_tmp);
lo_tmp = lo_entree.getNom();
lo_entree.setNom(lo_version.getNom());
lo_version.setNom(lo_tmp);
//l'URL change tj, nouveau fichier ou nouvelle adresse
//MAIS v�rifier pr�sence fichier avant
lo_tmp = lo_entree.getURL();
lo_entree.setURL(lo_version.getURL());
lo_version.setURL(lo_tmp);
Date lo_date = lo_entree.getDate();
lo_entree.setDate(lo_version.getDate());
lo_version.setDate(lo_date);
lo_version.setRaison(lo_vue.remarque);
lo_entree.addVersion(lo_version);
}
else {
//lo_db.update(lo_entreeTemporaire);
lo_entreeTemporaire =
(DBEntree) lo_db.load(DBEntree.class,
lo_entreeTemporaire.getId());
lo_entreeTemporaire.addVersion(lo_version);
}
//inclusion de l'utilisateur (load car risque de conflit si
update)
Integer lo_idUtilisateur = lo_vue.utilisateur.getId();
lo_version.setUtilisateur(
(DBUtilisateur) lo_db.load(DBUtilisateur.class,
lo_idUtilisateur));
//enfin on rend persistente la nouvelle version
lo_db.create(lo_version);
log.debug("\t</transaction>");
lo_db.commit();
log.debug("</connexion>");
lo_db.close();
}
catch (PersistenceException e) {
log.error("Impossible de sauver la donn�e : " + e);
throw new DatabaseException("Impossible de sauver la donn�e");
}
finally {
//rien � mettre (g�r� par castor)
}
}
catch (PersistenceException e) {
log.error("Impossible d'ouvrir la connexion : " + e);
throw new DatabaseException("Impossible d'ouvrir la connexion");
};
(hope you won't blame me to much for writing such code - DBVersion is a new
object not persistent before the transaction).
The exception occurs when calling lo_db.create(lo_version) on Castor's code
:
public int getPriority() {
if ( _priority == -1 ) {
int maxPrior = 0;
for ( int i = 0; i < _fhs.length; i++ ) {
if ( _fhs[i].isPersistanceCapable() && _fhs[i].isStored()
&&
_fhs[i].getFieldClassMolder().isKeyGeneratorUsed() ) {
maxPrior = Math.max( maxPrior,
_fhs[i].getFieldClassMolder().getPriority()+1 );
}
/* should an "if case" for add _ids[i].isForeginKey() in the
future */
}
_priority = maxPrior;
}
return _priority;
}
"_fhs[i].getFieldClassMolder().getPriority()" keeps returning the same
"ClassMolder fr.improve.bdi.mapping.jdo.DBCat" object resutling in an infini
te loop.
Hope there are enough clues to help you fix the problem. Otherwise I can
send you my code and database creation script.
Fran�ois
----- Original Message -----
From: "Thomas Yip" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, August 02, 2001 2:08 AM
Subject: [castor-dev] Object creation problem!
> Hi all,
>
> I just made a major enhancement to Castor JDO to solve the problem users
> reported over the last month regarding object creation in different
> situations. (it was more major than I first planned, so does the time
spent)
>
> The enhancements split the object creation into two phases. It first walks
> from the specified object, and mark all related (if autoStore is true),
and
> dependent object to be created. It then create object according to the
> determined priority.
>
> A priority is determined bases on if the object has any foreign key to
> key-generated object, and if that key-generated object contains foreign
key
> to another key-generated object, and if that......
>
> Could please everybody who reported creation problem, especially with
> key-generation, and different access mode pull the most update-to-date
code
> from the cvs to see if your problems solved? (Especially Master's
> dependent's related object, or "insert null" into non-null key-generated
> foreign key columns)
>
> One issue are that I have to broke the test case Persistent for now. I am
> looking for workaround on that right now.
>
>
> Please test the cvs now and don't wait until the next release, otherwise,
> all other creation situations might be solved but not yours.
>
>
>
> Thank you very much, all JDO users.
>
>
>
> Thomas
>
> -----------------------------------------------------------
> If you wish to unsubscribe from this mailing, send mail to
> [EMAIL PROTECTED] with a subject of:
> unsubscribe castor-dev
>
>
<!-- DOCTYPE databases PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.exolab.org/mapping.dtd" -->
<mapping>
<!-- DONNEES -->
<class name="fr.improve.bdi.mapping.jdo.DBCategorie" identity="id" key-generator="MAX">
<description>
Categories et classes liees.
Toutes les classes liees sont presentees comme des vues partielles (si elles existent).
</description>
<map-to table="categories" />
<field name="id" type="integer" >
<sql name="id" type="integer" />
</field>
<field name="date" type="date">
<sql name="date" type="char[HH:mm,dd/MM/yyyy]" />
</field>
<!-- temporaire, voir fontionnement des CLOBs -->
<field name="description" type="string">
<sql name="description" type="clob" dirty="ignore" />
</field>
<field name="editeurs" type="fr.improve.bdi.mapping.jdo.DBUtilisateur" collection="collection">
<sql name="editeur" many-table="editeurs_categorie" many-key="categorie" />
</field>
<field name="entrees" type="fr.improve.bdi.mapping.jdo.DBEntree" collection="collection">
<sql many-key="categorie" />
</field>
<field name="URLImage" type="string">
<sql name="url_image" type="varchar" />
</field>
<field name="catLiees" type="fr.improve.bdi.mapping.jdo.DBCat" collection="collection">
<sql name="cat_liee" many-table="cat_liees" many-key="categorie" />
</field>
<field name="newsLiees" type="fr.improve.bdi.mapping.jdo.DBNews" collection="collection">
<sql name="news_liee" many-table="news_liees" many-key="categorie" />
</field>
<field name="nom" type="string">
<sql name="nom" type="varchar" />
</field>
<field name="nbEntrees" type="integer">
<sql name="nb_entrees" type="integer" />
</field>
<field name="parent" type="fr.improve.bdi.mapping.jdo.DBCat" >
<sql name="parent" />
</field>
</class>
<class name="fr.improve.bdi.mapping.jdo.DBCat" identity="id" key-generator="MAX">
<description>
Vue partielle des categories (sans les classes liees).
A ne pas utiliser en ecriture.
</description>
<map-to table="categories" />
<field name="id" type="integer" >
<sql name="id" type="integer" />
</field>
<field name="date" type="date">
<sql name="date" type="char[HH:mm,dd/MM/yyyy]" />
</field>
<field name="URLImage" type="string">
<sql name="url_image" type="varchar" />
</field>
<field name="nom" type="string">
<sql name="nom" type="varchar" />
</field>
<field name="nbEntrees" type="integer">
<sql name="nb_entrees" type="integer" />
</field>
<field name="parent" type="fr.improve.bdi.mapping.jdo.DBCat" >
<sql name="parent" />
</field>
</class>
<class name="fr.improve.bdi.mapping.jdo.DBEntree" identity="id" key-generator="MAX">
<description>
Entree de la base
</description>
<map-to table="entrees" />
<field name="id" type="integer">
<sql name="id" type="integer" />
</field>
<!-- categorie compl�te pour verifier les autorisations lors de l affichage des versions -->
<field name="categorie" type="fr.improve.bdi.mapping.jdo.DBCategorie">
<sql name="categorie" />
</field>
<field name="date" type="date">
<sql name="date" type="date" />
</field>
<field name="document" type="boolean">
<sql name="document" type="char[01]" />
</field>
<field name="description" type="string">
<sql name="description" type="clob" dirty="ignore" />
</field>
<field name="URL" type="string">
<sql name="url" type="varchar" />
</field>
<field name="nom" type="string">
<sql name="nom" type="varchar" />
</field>
<field name="utilisateur" type="fr.improve.bdi.mapping.jdo.DBUtilisateur">
<sql name="utilisateur" />
</field>
<field name="versions" type="fr.improve.bdi.mapping.jdo.DBVersion" collection="collection">
<sql many-key="entree" />
</field>
</class>
<class name="fr.improve.bdi.mapping.jdo.DBHistorique" identity="id" key-generator="MAX">
<description>
Historique des �l�ments de la base.
</description>
<map-to table="historique" />
<field name="id" type="integer">
<sql name="id" type="integer" />
</field>
<field name="emplacement" type="integer">
<sql name="emplacement" type="integer" />
</field>
<field name="objet" type="integer">
<sql name="objet" type="integer" />
</field>
<field name="date" type="date">
<sql name="date" type="char[HH:mm,dd/MM/yyyy]" />
</field>
<field name="utilisateur" type="fr.improve.bdi.mapping.jdo.DBUtilisateur">
<sql name="utilisateur" />
</field>
<field name="raison" type="string">
<sql name="raison" type="clob" dirty="ignore" />
</field>
<field name="type" type="string">
<sql name="type" type="char" />
</field>
</class>
<class name="fr.improve.bdi.mapping.jdo.DBNews" identity="id" key-generator="MAX">
<description>
Sujets des news (SLASH)
</description>
<map-to table="news" />
<field name="id" type="integer">
<sql name="id" type="integer" />
</field>
<field name="sujet" type="string">
<sql name="sujet" type="varchar" />
</field>
</class>
<class name="fr.improve.bdi.mapping.jdo.DBUtilisateur" identity="id" key-generator="MAX">
<description>
Editeurs references dans la base
</description>
<map-to table="utilisateurs" />
<field name="id" type="integer">
<sql name="id" type="integer" />
</field>
<field name="aide" type="boolean">
<sql name="aide" type="char[NO]" />
</field>
<field name="catEditees" type="fr.improve.bdi.mapping.jdo.DBCat" collection="collection">
<sql name="categorie" many-table="editeurs_categorie" many-key="editeur" />
</field>
<field name="couriel" type="string">
<sql name="email" type="varchar" />
</field>
<field name="login" type="string">
<sql name="login" type="varchar" />
</field>
<field name="nom" type="string">
<sql name="nom" type="varchar" />
</field>
<field name="password" type="string">
<sql name="password" type="varchar" />
</field>
</class>
<class name="fr.improve.bdi.mapping.jdo.DBVersion" identity="id" key-generator="MAX">
<description>
Ancienne version d'un document
</description>
<map-to table="versions" />
<field name="id" type="integer">
<sql name="id" type="integer" />
</field>
<field name="date" type="date">
<sql name="date" type="date" />
</field>
<field name="description" type="string">
<sql name="description" type="clob" dirty="ignore" />
</field>
<field name="entree" type="fr.improve.bdi.mapping.jdo.DBEntree">
<sql name="entree" />
</field>
<field name="nom" type="string">
<sql name="nom" type="varchar" />
</field>
<field name="URL" type="string">
<sql name="url" type="varchar" />
</field>
<field name="utilisateur" type="fr.improve.bdi.mapping.jdo.DBUtilisateur">
<sql name="utilisateur" />
</field>
<field name="raison" type="string">
<sql name="raison" type="clob" dirty="ignore" />
</field>
</class>
<!-- DEMANDES -->
<class name="fr.improve.bdi.mapping.jdo.demande.DBDemande" identity="id" key-generator="MAX">
<description>
Permet de retrouver toutes les requetes pour une categorie donnee.
</description>
<map-to table="demandes" />
<field name="id" type="integer">
<sql name="id" type="integer" />
</field>
<field name="categorie" type="fr.improve.bdi.mapping.jdo.DBCategorie">
<sql name="categorie" />
</field>
<field name="date" type="long">
<sql name="date" type="bigint" />
</field>
<field name="objet" type="integer">
<sql name="objet" type="integer" />
</field>
<field name="type" type="string">
<sql name="type" type="char" />
</field>
<field name="utilisateur" type="fr.improve.bdi.mapping.jdo.DBUtilisateur">
<sql name="utilisateur" />
</field>
</class>
<class name="fr.improve.bdi.mapping.jdo.demande.DBDemandeCreation" extends="fr.improve.bdi.mapping.jdo.demande.DBDemande">
<description>
Permet de retrouver toutes les requetes pour une categorie donnee.
</description>
<map-to table="d_creation" />
<field name="entree" type="fr.improve.bdi.mapping.jdo.DBEntree">
<sql name="entree" />
</field>
</class>
<class name="fr.improve.bdi.mapping.jdo.demande.DBDemandeDeplacement" extends="fr.improve.bdi.mapping.jdo.demande.DBDemande">
<description>
Permet de retrouver toutes les requetes pour une categorie donnee.
</description>
<map-to table="d_deplacement" />
<field name="raison" type="string">
<sql name="raison" type="clob" dirty="ignore" />
</field>
</class>
<class name="fr.improve.bdi.mapping.jdo.demande.DBDemandeModification" extends="fr.improve.bdi.mapping.jdo.demande.DBDemande">
<description>
Permet de retrouver toutes les requetes pour une categorie donnee.
</description>
<map-to table="d_modification" />
<field name="cible" type="integer">
<sql name="cible" type="integer" />
</field>
<field name="raison" type="string">
<sql name="raison" type="clob" dirty="ignore" />
</field>
</class>
<class name="fr.improve.bdi.mapping.jdo.demande.DBDemandeSuppression" extends="fr.improve.bdi.mapping.jdo.demande.DBDemande">
<description>
Permet de retrouver toutes les requetes pour une categorie donnee.
</description>
<map-to table="d_suppression" />
<field name="raison" type="string">
<sql name="raison" type="clob" dirty="ignore" />
</field>
</class>
</mapping>