Yes, Jakob gets the point.

As far as I understood, if I don't specify the collection-class, OJB will
use RemovalAwareCollection.
Being as is, when I remove an object from the intermediary collection, the N
object should be deleted from the N table when we store the M object only
when auto-delete feature is true.

If the collection-class is not RemovalAware, then there is no problem.
Things should be as they had from months. Or OJB should not use
RemovalAwareCollection as default for M:N non-decomposible.

That's about my hack is.

I undertand Thomas points about my configuration. He is right. Maybe the
only thing that should be fixed is documentation. Maybe I'm doing some kind
of biggest-than-ever mistake. Check what a kind of collection-descriptor I
use here:

    <collection-descriptor
         name="perfis"
         element-class-ref="br.com.mgr.beans.PerfilPessoaFJBean"
         indirection-table="RL_PESSOA_TIPOPESSOA"
         proxy="true"
         auto-retrieve="true"
         auto-update="false"
         auto-delete="false">
       <fk-pointing-to-this-class column="CO_PESSOA"/>
       <fk-pointing-to-element-class column="CO_TIPO_PESSOA"/>
    </collection-descriptor>

where perfis is related to setPerfis and getPerfis:

public class Pessoa {
  private List perfis;
  public void setPerfis( List p ) {this.perfis=p;}
  public List getPerfis( ) {return this.perfis;}
}

Just it!

Now, if I delete an element as in getPerfis().remove(0) and then
broker.store( pessoa ), the real object is not anymore deleted.
And if I put auto-delete="true" and issue getPerfis().remove(0) and then
broker.store( pessoa ), the indirection record and the real object is
deleted.

May be this a my mis-interpretation? Why M:N documentation don't say
anything about "use ManageableArrayList if you wish your objects not being
deleted from the N side"? And that RemovalAwareCollection is the default
collection if you don't specify one?

Excuse-me if all this thread is my mistake, but I'm very happy because after
fix tomorrow, all my app came to a stable and clear behaviour...

Thanks,

Edson Richter


----- Original Message ----- 
From: "Jakob Braeuchi" <[EMAIL PROTECTED]>
To: "OJB Users List" <[EMAIL PROTECTED]>
Sent: Thursday, June 26, 2003 5:27 PM
Subject: Re: SOLUTION for M:N never delete or always delete, no matter
auto-delete="true" or auto-delete="false"


hi thomas,

so my testcases are wrong as well :(  (it's probably too hot here)

to clarify this issue:
- when the collection IS removal aware the n side is ALWAYS deleted when
removed from the collection (not matter of the auto-xxx settings).
- when the collection IS NOT removal aware the n side is NEVER deleted.

is this how it should be ?

jakob

Thomas Mahler wrote:

> Hi again,
>
> Edson Carlos Ericksson Richter wrote:
>
>> (this is a real long mail, but I've made a long research. The first
>> part is
>> the reason I started to research, the second is explain why this
>> occur. The
>> third is a suggestion of how can we correct).
>>
>> FIRST PART:
>> Ok. To avoid the problem related to OJB always using
>> RemovalAwareCollection,
>> I put my beans to work as
>>
>> public class A {
>>   private ArrayList myColl = new ArrayList();
>>
>>   public void setMyCollection( List collection ) { this.myColl.clear;
>> this.myColl.addAll( collection ); }
>>   public List getMyCollection( ) {return this.myColl;}
>> }
>>
>> Doing this, I'm converting from RemovalAwareCollection to ArrayList.
>> Fine.
>>
>
> why do you type your attribute as ArrayList? if you just have "List
> myColl = ..." it would safe a lot of problems...
>
> If you really wnat to use ARrayList just use
> collection-class="ManageableArrayList" in the collection-descriptor.
> This will avoid the addAll call!
>
>> Now suppose that I want auto-delete="true". Then I
>>
>> getMyCollection().remove(0);
>>
>> and then persist the object. Theorically, OJB should delete the
>> object from
>> indirection table AND the referenced table (the N side, ok?).
>
>
> No! entries are deleted only from the indirection table! objects are
> only deleted automatically from the N side if you use a
> RemovalAwareCollection.
>
> This not
>
>> occur. OJB deletes only from indirection table (the auto-delete
>> option makes
>> no difference).
>
>
> auto-delete does not change any behaviour of broker.store(...). It is
> meant to change behaviour of broker.delete(...) calls !
>
>>
>> If I change the code to
>>
>> public class A {
>>   private List myColl;
>>
>>   public void setMyCollection( List collection ) {
>> this.myColl=collection; }
>>   public List getMyCollection( ) {return this.myColl;}
>> }
>>
>> then it works (because the collection passed to setter is
>> RemovalAwareCollection).
>
>
> as explained above.
>
>> BUT, if I put auto-delete="false", then OJB still
>> delete the indirection table AND the referenced table (again, the
>> auto-delete option makes no difference).
>
>
> as expalined above.
>
>> SECOND PART:
>> To the facts: since OJB is using RemovalAwareCollection, after the
>> correct
>> treatment for M:N non-decomposable queries (that my debugging show
>> that it
>> is working like a charm), the following code is being executed:
>>
>>                 // invoke callback on collection
>>                 if (col instanceof ManageableCollection)
>>                 {
>>                     ((ManageableCollection) col).afterStore(this);
>>                 }
>>
>> That is deleting the real objects, even if auto-delete="false".
>
>
> if you don't want delete semantics just use
> collection-class="ManageableArrayList" in the collection-descriptor.
>
>>
>> THIRD PART:
>> The method deleteMtoNImplementor(...) should reset the
>> "allObjectsToBeRemoved" in RemovalAwareCollection if the auto-delete
>> option
>> is set to false. What do you think?
>
>
> I don't think so, because auto-delete is not used during store(..).
>
> I think you problems can be solved by simple configuration settings. I
> did not see any errors in the mentioned OJB code. So I don't feel that
> the existing behaviour should be changed.
>
> cheers,
> Thomas
>
>> Something like create a RemovalAware
>> interface. Make all classes (RemovalAwareCollection, and
>> RemovalAwareList in
>> my case) implement it. Then do
>>
>> public interface RemovalAware {
>>
>>   public void resetDeleted();
>> }
>>
>> The resetDelete method implementation is just
>>
>> public void resetDeleted( ) {
>>   allObjectsToBeRemoved.clear();
>> }
>>
>>
>> and then change PersistentBrokerImpl to
>>
>>                     currentMtoNKeys = getMtoNImplementor(cds, obj);
>>                     // delete unused m:n implementors
>>                     deleteMtoNImplementor(cds, obj, (Collection)col,
>> currentMtoNKeys);
>>
>>                     if( col instanceof ManageableCollection &&
>> !cds.getCascadeDelete() ) {
>>                       Collection testCol;
>>                       if( col instanceof CollectionProxy ) {
>>                         testCol = ( ( CollectionProxy )col ).getData();
>>                       } else {
>>                         testCol = ( Collection )col;
>>                       }
>>
>>                       if( testCol instanceof RemovalAware ) {
>>                         ( ( RemovalAware )testCol ).resetDeleted();
>>                       }
>>                     }
>>
>> This make M:N suff work working. I'm using CVS HEAD.
>>
>> Thanks for your patience.
>>
>> Edson Richter
>>
>>
>>
>>
>> ---
>> Outgoing mail is certified Virus Free.
>> Checked by AVG anti-virus system (http://www.grisoft.com).
>> Version: 6.0.493 / Virus Database: 292 - Release Date: 25/6/2003
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.493 / Virus Database: 292 - Release Date: 25/6/2003


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to