Hi Christian,

Unflattening gives you more flexibility.  Keep in mind, though, that
you can always write helper methods in your Apple class to simplify
use when you don't need to manipulate the join table.  You could add
to your Apple.java:

public List<Plum> getPlums() {...}
public void addToPlums(Plum plum) {...}
etc.

mrg


On Fri, Feb 18, 2011 at 9:02 AM, Christian Grobmeier
<[email protected]> wrote:
> Thanks for all your comments. I decided to do the "Mike-Way" below and
> to unflatten my stuff :-)
>
> Cheers!
> Christian
>
> On Fri, Feb 18, 2011 at 2:37 PM, Mike Kienenberger <[email protected]> wrote:
>> You can also fake your own flattened attribute by writing
>> "Apple.getPlum()" and "Plum.getApple()" yourself using the
>> intermediate entity.
>>
>> On Fri, Feb 18, 2011 at 5:18 AM, Robert Zeigler
>> <[email protected]> wrote:
>>> You can access the intermediate object if you choose not to flatten the 
>>> relationship.  There's nothing to prevent a join table from being 
>>> represented as its own entity in cayenne. It can make your application a 
>>> little more complicated, but I've done it before when the join table 
>>> carries additional meaningful information, eg, information that somehow 
>>> modulates the join (eg: creating a createDate column on the join table for 
>>> keeping track of exactly when the association was created... stuff like 
>>> that).
>>>
>>> Cheers,
>>>
>>> Robert
>>> On Feb 18, 2011, at 2/184:10 AM , Christian Grobmeier wrote:
>>>
>>>>> What semantically is "isFresh" attribute? Is it a some business logic
>>>>> attibute, or simple "autoset" variable, like timestamp etc.?
>>>>
>>>> No its business logic. In fact it defines the view-rights for the
>>>> specific apples to the plums :-)
>>>>
>>>>> If former, you cannot live without ApplePlum ObjEntity. Is the problem
>>>>> then in just setting its default value? Then you can simply set it at
>>>>> database level.
>>>>
>>>> OK, I will try to change my mind on this one. I have hoped I could
>>>> somehow access the intermediate object.
>>>>
>>>> THanks!
>>>>
>>>> Cheers
>>>> Christian
>>>>
>>>>
>>>>> If the default value is dynamic, like timestamp, you can try intercept
>>>>> Cayenne's generating of queries:
>>>>> http://cayenne.apache.org/doc30/custom-batchquerybuilder-factory.html
>>>>>
>>>>> 2011/2/18 Christian Grobmeier <[email protected]>:
>>>>>> Hello,
>>>>>>
>>>>>> I have the following scenario:
>>>>>>
>>>>>> Apple 1 -> n ApplePlum n : 1 Plum
>>>>>>
>>>>>> I want store an additional flag in ApplePlum (lets say isFresh = 
>>>>>> true/false
>>>>>>
>>>>>> How can I do this? I know I should not use flattened relations, but
>>>>>> they are so nice, I would like to keep them. At least it would lead to
>>>>>> the Method getApplePlum->getPlum which is not very neat.
>>>>>>
>>>>>> In order to do so I have thought I could create a custom method in my
>>>>>> Apple class, which copies some code from the _Apple class.
>>>>>>
>>>>>> Like this:
>>>>>>
>>>>>> public void addToAppleAsFreshPlum(Plum value) {
>>>>>>        String relName = "ApplePlum";
>>>>>>        if (value == null) {
>>>>>>            throw new NullPointerException("Attempt to add null target
>>>>>> DataObject.");
>>>>>>        }
>>>>>>
>>>>>>        willConnect(relName, value);
>>>>>>        Object holder = readProperty("ApplePlum");
>>>>>>
>>>>>> // Now I would like to get the object created by the holder:
>>>>>>        ((ApplePlum)holder).setFresh(true);
>>>>>>
>>>>>>        getObjectContext().propertyChanged(this, relName, null, value);
>>>>>>
>>>>>>        if (holder instanceof Collection) {
>>>>>>            ((Collection<Object>) holder).add(value);
>>>>>>        }
>>>>>>        else if (holder instanceof Map) {
>>>>>>            ((Map<Object, Object>) holder).put(getMapKey(relName,
>>>>>> value), value);
>>>>>>        }
>>>>>>
>>>>>>        setReverseRelationship(relName, value);
>>>>>>    }
>>>>>>
>>>>>> Of course this does not work. I wonder if there is another option for
>>>>>> me? Any ideas?
>>>>>>
>>>>>> Thanks in advance
>>>>>> Christian
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Andrey
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> http://www.grobmeier.de
>>>
>>>
>>
>
>
>
> --
> http://www.grobmeier.de
>

Reply via email to