I'll try that ASAP...

Richter

> hi armin, edson,
>
> i commited a small fix to this problem. it still uses sql alternative A)
> the NPE is imo due to a type mismatch when building the Identities, see the
> comment in associateBatched.
>
> jakob
>
> Jakob Braeuchi wrote:
>
>> hi edson,
>>
>> looks like my question wasn't clear enough ;) i know the join i have to
>> do but i'm not sure about how to select the multiple keys when
>> retrieving all A for several Cs:
>>
>> A)
>>
>> select *
>> from A join B
>> on A.A1 = B.A1 and A.A2 = B.A2
>> join C
>> on C.C1 = B.C1 and C.C2 = B.C2 and C.C3 = B.C3
>> where
>> (C.C1 = 1 and C2 = 2 and C.C3 = 3) or
>> (C.C1 = 11 and C2 = 12 and C.C3 = 13) or
>> (C.C1 = 21 and C2 = 22 and C.C3 = 23) or
>> (C.C1 = 31 and C2 = 32 and C.C3 = 33)
>>
>> (C.C1 =  and C2 =  and C.C3 = ) will be repeated for every C.
>> this will result in a quite complex sql depending on the number of Cs.
>>
>> an alternative would be to use IN-statement as in single-key :
>>
>> B)
>>
>> select *
>> from A join B
>> on A.A1 = B.A1 and A.A2 = B.A2
>> join C
>> on C.C1 = B.C1 and C.C2 = B.C2 and C.C3 = B.C3
>> where
>> C.C1 in ( 1, 11, 21, 31) and
>> C.C2 in ( 2, 12, 22, 32) and
>> C.C3 in ( 3, 13, 23, 33)
>>
>> the query is simpler but may return more As than necessary because the
>> IN-statements do not constrain the combination of keys.
>>
>> i prefer alternative A) what do you think ?
>>
>> jakob
>>
>>
>> Edson Carlos Ericksson Richter wrote:
>>
>>> Thinking less abstract, the field names of PK in A object are same
>>> field names in B table, as the field names of PK in C are the same
>>> field names in B.
>>>
>>> So, if A has the fields A1, A2 (PKs), and C has fields C1, C2, C3
>>> (PKs), then B has fields A1, A2, C1, C2, C3.
>>>
>>> So, the select will be:
>>>
>>> select *
>>> from A join B
>>> on A.A1 = B.A1 and A.A2 = B.A2
>>> join C
>>> on C.C1 = B.C1 and C.C2 = B.C2 and C.C3 = B.C3
>>>
>>> IMHO,
>>>
>>> the names of the fields are not important, but their position. The
>>> "pointing-to-this-class" should be understood as 1st PK is pointing to
>>> first field, and 2nd PK to the 2nd field.
>>>
>>> The first pointing-to-element should be mapped to 1st PK in the N
>>> element, the 2nd to the second PK, and the 3rd, to 3rd PK.
>>>
>>> As far as I can see, the MtoN must know the CDS of the M element and
>>> the N element, so the mapping could be done.
>>>
>>>
>>> Richter
>>>
>>>
>>> Edson Carlos Ericksson Richter wrote:
>>>
>>>> The expected result is something like
>>>>
>>>> A<->B<->C
>>>>
>>>> Where A is M side has PK with 2 fields, C is N side has PK with 3
>>>> fields, B is indirection table, and has 5 fields.
>>>>
>>>> select *
>>>> from A join B
>>>>  on A.field1 = B.field1 and A.field2 = B.field2
>>>> join C
>>>>  on C.field1 = B.field3 and C.field2 = B.field4 and C.field3 = B.field5
>>>>
>>>> I expect this help.
>>>>
>>>>
>>>> Edson Richter
>>>>
>>>>
>>>> Jakob Braeuchi wrote:
>>>>
>>>>> hi edson,
>>>>>
>>>>> imo the whole handling of the multi-key criteria is a little bit weird.
>>>>> what should the sql look like in your case ?
>>>>>
>>>>> jakob
>>>>>
>>>>> Edson Carlos Ericksson Richter wrote:
>>>>>
>>>>>> Hum... There is some instability here.
>>>>>> I don't know what combination of dynamic proxies/collection proxies is
>>>>>> causing this bug. I've fixed using either proxy=true in the
>>>>>> collections
>>>>>> inside each bean...
>>>>>>
>>>>>> Why? I really don't know. I'll need to compare each of the 12
>>>>>> collections
>>>>>> involved in this beans to know what's give the stack trace...
>>>>>> I'll need sometime to restart the app 132 times to know :(
>>>>>>
>>>>>> Anyway, if someone could send me the rc5 implementation of the
>>>>>> method, so I
>>>>>> can compare with actual, I'll appreciate.
>>>>>>
>>>>>> Thanks in advantage.
>>>>>>
>>>>>>
>>>>>> Edson Richter
>>>>>>
>>>>>>
>>>>>> ----- Original Message ----- From: Edson Carlos Ericksson Richter
>>>>>> To: 'OJB Users List'
>>>>>> Sent: Wednesday, March 24, 2004 2:46 PM
>>>>>> Subject:
>>>>>> MtoNCollectionPrefetcher.buildPrefetchCriteriaMultipleKeys(MtoNCollectionPre
>>>>>>
>>>>>> fetcher.java:338)
>>>>>>
>>>>>>
>>>>>> This bug is driving me crazy... Someone could point me what changed
>>>>>> from rc5
>>>>>> to 1.0 in this method (so I can at least fix locally)?
>>>>>>
>>>>>> The problem is a M:N mapping using composite pk pointing the M
>>>>>> bean, and 1
>>>>>> field pk pointing to the N bean.
>>>>>> The stack trace is:
>>>>>>
>>>>>> java.lang.ArrayIndexOutOfBoundsException: 1
>>>>>>         at
>>>>>> org.apache.ojb.broker.accesslayer.MtoNCollectionPrefetcher.buildPrefetchCrit
>>>>>>
>>>>>> eriaMultipleKeys(MtoNCollectionPrefetcher.java:338)
>>>>>>         at
>>>>>> org.apache.ojb.broker.accesslayer.MtoNCollectionPrefetcher.buildPrefetchCrit
>>>>>>
>>>>>> eria(MtoNCollectionPrefetcher.java:259)
>>>>>>         at
>>>>>> org.apache.ojb.broker.accesslayer.MtoNCollectionPrefetcher.buildPrefetchQuer
>>>>>>
>>>>>> y(MtoNCollectionPrefetcher.java:115)
>>>>>>         at
>>>>>> org.apache.ojb.broker.accesslayer.CollectionPrefetcher.buildPrefetchQueries(
>>>>>>
>>>>>> CollectionPrefetcher.java:93)
>>>>>>         at
>>>>>> org.apache.ojb.broker.accesslayer.MtoNCollectionPrefetcher.prefetchRelations
>>>>>>
>>>>>> hip(MtoNCollectionPrefetcher.java:68)
>>>>>>         at
>>>>>> org.apache.ojb.broker.core.QueryReferenceBroker.performRetrievalTasks(QueryR
>>>>>>
>>>>>> eferenceBroker.java:277)
>>>>>>         at
>>>>>> org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe
>>>>>>
>>>>>> ferenceBroker.java:146)
>>>>>>         at
>>>>>> org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(QueryRe
>>>>>>
>>>>>> ferenceBroker.java:203)
>>>>>>         at
>>>>>> org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Persis
>>>>>>
>>>>>> tenceBrokerImpl.java:1046)
>>>>>>         at
>>>>>> org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery(
>>>>>>
>>>>>> DelegatingPersistenceBroker.java:321)
>>>>>>         at
>>>>>> org.apache.ojb.broker.core.DelegatingPersistenceBroker.getCollectionByQuery(
>>>>>>
>>>>>> DelegatingPersistenceBroker.java:321)
>>>>>>         at
>>>>>> org.apache.ojb.broker.accesslayer.CollectionProxy.loadData(CollectionProxy.j
>>>>>>
>>>>>> ava:109)
>>>>>>         at
>>>>>> org.apache.ojb.broker.accesslayer.ListProxy.loadData(ListProxy.java:148)
>>>>>>
>>>>>>         at
>>>>>> org.apache.ojb.broker.accesslayer.CollectionProxy.getData(CollectionProxy.ja
>>>>>>
>>>>>> va:362)
>>>>>>         at
>>>>>> org.apache.ojb.broker.accesslayer.ListProxy.getListData(ListProxy.java:140)
>>>>>>
>>>>>>         at
>>>>>> org.apache.ojb.broker.accesslayer.ListProxy.get(ListProxy.java:71)
>>>>>>         at
>>>>>> br.com.mgr.dialogs.ListBasedListModel.getElementAt(ListBasedListModel.java:6
>>>>>>
>>>>>> 3)
>>>>>>         at
>>>>>> javax.swing.plaf.basic.BasicListUI.updateLayoutState(BasicListUI.java:1147)
>>>>>>
>>>>>>         at
>>>>>> javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1
>>>>>>
>>>>>> 098)
>>>>>>         at
>>>>>> javax.swing.plaf.basic.BasicListUI.getPreferredSize(BasicListUI.java:281)
>>>>>>
>>>>>>         at
>>>>>> javax.swing.JComponent.getPreferredSize(JComponent.java:1275)
>>>>>>         at
>>>>>> javax.swing.JList.getPreferredScrollableViewportSize(JList.java:1913)
>>>>>>         at
>>>>>> javax.swing.ViewportLayout.preferredLayoutSize(ViewportLayout.java:72)
>>>>>>         at java.awt.Container.preferredSize(Container.java:1178)
>>>>>>         at java.awt.Container.getPreferredSize(Container.java:1162)
>>>>>>         at
>>>>>> javax.swing.JComponent.getPreferredSize(JComponent.java:1277)
>>>>>>         at
>>>>>> javax.swing.ScrollPaneLayout.preferredLayoutSize(ScrollPaneLayout.java:475)
>>>>>>
>>>>>>         at java.awt.Container.preferredSize(Container.java:1178)
>>>>>>         at java.awt.Container.getPreferredSize(Container.java:1162)
>>>>>>         at
>>>>>> javax.swing.JComponent.getPreferredSize(JComponent.java:1277)
>>>>>>         at
>>>>>> java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:572)
>>>>>>         at java.awt.Container.preferredSize(Container.java:1178)
>>>>>>         at java.awt.Container.getPreferredSize(Container.java:1162)
>>>>>>         at
>>>>>> javax.swing.JComponent.getPreferredSize(JComponent.java:1277)
>>>>>>         at
>>>>>> javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.calculateSize(Basi
>>>>>>
>>>>>> cTabbedPaneUI.java:2001)
>>>>>>         at
>>>>>> javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.preferredLayoutSiz
>>>>>>
>>>>>> e(BasicTabbedPaneUI.java:1975)
>>>>>>         at java.awt.Container.preferredSize(Container.java:1178)
>>>>>>         at java.awt.Container.getPreferredSize(Container.java:1162)
>>>>>>         at
>>>>>> javax.swing.JComponent.getPreferredSize(JComponent.java:1277)
>>>>>>         at
>>>>>> java.awt.GridBagLayout.GetLayoutInfo(GridBagLayout.java:892)
>>>>>>         at
>>>>>> java.awt.GridBagLayout.getLayoutInfo(GridBagLayout.java:806)
>>>>>>         at java.awt.GridBagLayout.ArrangeGrid(GridBagLayout.java:1374)
>>>>>>         at java.awt.GridBagLayout.arrangeGrid(GridBagLayout.java:1337)
>>>>>>         at
>>>>>> java.awt.GridBagLayout.layoutContainer(GridBagLayout.java:706)
>>>>>>         at java.awt.Container.layout(Container.java:1020)
>>>>>>         at java.awt.Container.doLayout(Container.java:1010)
>>>>>>         at java.awt.Container.validateTree(Container.java:1092)
>>>>>>         at java.awt.Container.validateTree(Container.java:1099)
>>>>>>         at java.awt.Container.validateTree(Container.java:1099)
>>>>>>         at java.awt.Container.validateTree(Container.java:1099)
>>>>>>         at java.awt.Container.validate(Container.java:1067)
>>>>>>         at
>>>>>> javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:353
>>>>>>
>>>>>> )
>>>>>>         at
>>>>>> javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQu
>>>>>>
>>>>>> eueUtilities.java:116)
>>>>>>         at
>>>>>> java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
>>>>>>         at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
>>>>>>         at
>>>>>> java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.ja
>>>>>>
>>>>>> va:201)
>>>>>>         at
>>>>>> java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java
>>>>>>
>>>>>> :151)
>>>>>>         at
>>>>>> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
>>>>>>         at
>>>>>> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
>>>>>>         at
>>>>>> java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
>>>>>>
>>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Edson Richter
>>>>>>
>>>>>>
>>>>>>
>>>>>> ---
>>>>>> Outgoing mail is certified Virus Free.
>>>>>> Checked by AVG anti-virus system (http://www.grisoft.com).
>>>>>> Version: 6.0.637 / Virus Database: 408 - Release Date: 20/3/2004
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> 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]
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> 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]

Reply via email to