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>

Reply via email to