entity-auto with 3-parts PK

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

entity-auto with 3-parts PK

Bruno Busco
Hi devs,
I am trying to set this service up.

    <service name="createPortalPagePortlet"
default-entity-name="PortalPagePortlet" engine="entity-auto" invoke="create"
auth="true">
        <description>Add a registered PortalPortlet to a
PortalPage</description>
        <auto-attributes include="pk" mode="IN" optional="false"/>
        <auto-attributes include="nonpk" mode="IN" optional="true"/>
        <override name="sequenceNum" mode="OUT" optional="true"/>
    </service>

to create this entity:

    <entity entity-name="PortalPagePortlet"
            package-name="org.ofbiz.common.portal"
            title="Defines Portlets included into Portal Pages">

        <field name="portalPageId"      type="id-ne"></field>
        <field name="portalPortletId"   type="id-ne"></field>
        <field name="sequenceNum"       type="id-ne"><description>Identify
the portalPortlet instance in case more copy of the same portalPortlet are
present in the same portalPage</description></field>
        <field name="columnNum"         type="numeric"></field>
        <field name="rowNum"            type="numeric"></field>

        <prim-key field="portalPageId"/>
        <prim-key field="portalPortletId"/>
        <prim-key field="sequenceNum"/>
    </entity>

It was OK before adding the sequenceNum field as PK and adding the
<override>.
Now what I would like to get is the sequenceNum auto-generation.

But the framework tells me:
Error doing entity-auto operation for entity [PortalPagePortlet] in service
[createPortalPagePortlet]: org.ofbiz.service.GenericServiceException: In
Service [createPortalPagePortlet] which uses the entity-auto engine with the
create invoke option: could not find a valid combination of primary key
settings to do a known create operation; options include: 1. a single OUT pk
for primary auto-sequencing, 2. a single INOUT pk for primary
auto-sequencing with optional override, 3. a 2-part pk with one part IN
(existing primary pk) and one part OUT (the secdonary pk to sub-sequence, 4.
all pk fields are IN for a manually specified primary key

Digging into the code It seems to me that it is not possible to have the
sequenceNum auto-generation in the case of a 3-parts PK.
Am I correct?
Any work-around?

Should I switch to engine="simple" and use the code that is indicated as
comment in EntityAutoEngine.java ?
                    <make-value entity-name="ExampleItem"
value-name="newEntity"/>
                    <set-pk-fields map-name="parameters"
value-name="newEntity"/>
                    <make-next-seq-id value-name="newEntity"
seq-field-name="exampleItemSeqId"/> <!-- this finds the next sub-sequence ID
-->
                    <field-to-result field-name="newEntity.exampleItemSeqId"
result-name="exampleItemSeqId"/>
                    <set-nonpk-fields map-name="parameters"
value-name="newEntity"/>
                    <create-value value-name="newEntity"/>

Many thanks,
Bruno
Reply | Threaded
Open this post in threaded view
|

Re: entity-auto with 3-parts PK

David E Jones

Yes, I think your options are either to use the simple-method "make-
next-seq-id" action or extend the "entity-auto" thingy.

On a side note, to be more consistent with other parts of the data  
model, the field being sub-sequenced should have the suffix "SeqId",  
like porletSeqId.

Stepping back a little bit... does it even make sense to have the same  
portlet on a page more than once? I suppose if they can be  
parameterized it does make sense (like two clock portlets for  
different time zones).

Another option would be to use fromDate/thruDate where fromDate in the  
pk will make it unique, or even just an "addDate" or something.

-David


On Oct 19, 2008, at 5:10 PM, Bruno Busco wrote:

> Hi devs,
> I am trying to set this service up.
>
>    <service name="createPortalPagePortlet"
> default-entity-name="PortalPagePortlet" engine="entity-auto"  
> invoke="create"
> auth="true">
>        <description>Add a registered PortalPortlet to a
> PortalPage</description>
>        <auto-attributes include="pk" mode="IN" optional="false"/>
>        <auto-attributes include="nonpk" mode="IN" optional="true"/>
>        <override name="sequenceNum" mode="OUT" optional="true"/>
>    </service>
>
> to create this entity:
>
>    <entity entity-name="PortalPagePortlet"
>            package-name="org.ofbiz.common.portal"
>            title="Defines Portlets included into Portal Pages">
>
>        <field name="portalPageId"      type="id-ne"></field>
>        <field name="portalPortletId"   type="id-ne"></field>
>        <field name="sequenceNum"       type="id-
> ne"><description>Identify
> the portalPortlet instance in case more copy of the same  
> portalPortlet are
> present in the same portalPage</description></field>
>        <field name="columnNum"         type="numeric"></field>
>        <field name="rowNum"            type="numeric"></field>
>
>        <prim-key field="portalPageId"/>
>        <prim-key field="portalPortletId"/>
>        <prim-key field="sequenceNum"/>
>    </entity>
>
> It was OK before adding the sequenceNum field as PK and adding the
> <override>.
> Now what I would like to get is the sequenceNum auto-generation.
>
> But the framework tells me:
> Error doing entity-auto operation for entity [PortalPagePortlet] in  
> service
> [createPortalPagePortlet]:  
> org.ofbiz.service.GenericServiceException: In
> Service [createPortalPagePortlet] which uses the entity-auto engine  
> with the
> create invoke option: could not find a valid combination of primary  
> key
> settings to do a known create operation; options include: 1. a  
> single OUT pk
> for primary auto-sequencing, 2. a single INOUT pk for primary
> auto-sequencing with optional override, 3. a 2-part pk with one part  
> IN
> (existing primary pk) and one part OUT (the secdonary pk to sub-
> sequence, 4.
> all pk fields are IN for a manually specified primary key
>
> Digging into the code It seems to me that it is not possible to have  
> the
> sequenceNum auto-generation in the case of a 3-parts PK.
> Am I correct?
> Any work-around?
>
> Should I switch to engine="simple" and use the code that is  
> indicated as
> comment in EntityAutoEngine.java ?
>                    <make-value entity-name="ExampleItem"
> value-name="newEntity"/>
>                    <set-pk-fields map-name="parameters"
> value-name="newEntity"/>
>                    <make-next-seq-id value-name="newEntity"
> seq-field-name="exampleItemSeqId"/> <!-- this finds the next sub-
> sequence ID
> -->
>                    <field-to-result field-
> name="newEntity.exampleItemSeqId"
> result-name="exampleItemSeqId"/>
>                    <set-nonpk-fields map-name="parameters"
> value-name="newEntity"/>
>                    <create-value value-name="newEntity"/>
>
> Many thanks,
> Bruno

Reply | Threaded
Open this post in threaded view
|

Re: entity-auto with 3-parts PK

Bruno Busco
David,
thank you for your hints, I have changed to a simple method for now and it
works great!
I will also change the field name to *SeqId.

Yes, the reason why I would like to have the same portlets on a page more
than once is because they will be parametrized at a later stage. I would
leave this feature as a second step (after the first review and commit of
the whole thing) but it is better to have the base ready for that.

Thank you,
Bruno



2008/10/20 David E Jones <[hidden email]>

>
> Yes, I think your options are either to use the simple-method
> "make-next-seq-id" action or extend the "entity-auto" thingy.
>
> On a side note, to be more consistent with other parts of the data model,
> the field being sub-sequenced should have the suffix "SeqId", like
> porletSeqId.
>
> Stepping back a little bit... does it even make sense to have the same
> portlet on a page more than once? I suppose if they can be parameterized it
> does make sense (like two clock portlets for different time zones).
>
> Another option would be to use fromDate/thruDate where fromDate in the pk
> will make it unique, or even just an "addDate" or something.
>
> -David
>
>
>
> On Oct 19, 2008, at 5:10 PM, Bruno Busco wrote:
>
>  Hi devs,
>> I am trying to set this service up.
>>
>>   <service name="createPortalPagePortlet"
>> default-entity-name="PortalPagePortlet" engine="entity-auto"
>> invoke="create"
>> auth="true">
>>       <description>Add a registered PortalPortlet to a
>> PortalPage</description>
>>       <auto-attributes include="pk" mode="IN" optional="false"/>
>>       <auto-attributes include="nonpk" mode="IN" optional="true"/>
>>       <override name="sequenceNum" mode="OUT" optional="true"/>
>>   </service>
>>
>> to create this entity:
>>
>>   <entity entity-name="PortalPagePortlet"
>>           package-name="org.ofbiz.common.portal"
>>           title="Defines Portlets included into Portal Pages">
>>
>>       <field name="portalPageId"      type="id-ne"></field>
>>       <field name="portalPortletId"   type="id-ne"></field>
>>       <field name="sequenceNum"       type="id-ne"><description>Identify
>> the portalPortlet instance in case more copy of the same portalPortlet are
>> present in the same portalPage</description></field>
>>       <field name="columnNum"         type="numeric"></field>
>>       <field name="rowNum"            type="numeric"></field>
>>
>>       <prim-key field="portalPageId"/>
>>       <prim-key field="portalPortletId"/>
>>       <prim-key field="sequenceNum"/>
>>   </entity>
>>
>> It was OK before adding the sequenceNum field as PK and adding the
>> <override>.
>> Now what I would like to get is the sequenceNum auto-generation.
>>
>> But the framework tells me:
>> Error doing entity-auto operation for entity [PortalPagePortlet] in
>> service
>> [createPortalPagePortlet]: org.ofbiz.service.GenericServiceException: In
>> Service [createPortalPagePortlet] which uses the entity-auto engine with
>> the
>> create invoke option: could not find a valid combination of primary key
>> settings to do a known create operation; options include: 1. a single OUT
>> pk
>> for primary auto-sequencing, 2. a single INOUT pk for primary
>> auto-sequencing with optional override, 3. a 2-part pk with one part IN
>> (existing primary pk) and one part OUT (the secdonary pk to sub-sequence,
>> 4.
>> all pk fields are IN for a manually specified primary key
>>
>> Digging into the code It seems to me that it is not possible to have the
>> sequenceNum auto-generation in the case of a 3-parts PK.
>> Am I correct?
>> Any work-around?
>>
>> Should I switch to engine="simple" and use the code that is indicated as
>> comment in EntityAutoEngine.java ?
>>                   <make-value entity-name="ExampleItem"
>> value-name="newEntity"/>
>>                   <set-pk-fields map-name="parameters"
>> value-name="newEntity"/>
>>                   <make-next-seq-id value-name="newEntity"
>> seq-field-name="exampleItemSeqId"/> <!-- this finds the next sub-sequence
>> ID
>> -->
>>                   <field-to-result field-name="newEntity.exampleItemSeqId"
>> result-name="exampleItemSeqId"/>
>>                   <set-nonpk-fields map-name="parameters"
>> value-name="newEntity"/>
>>                   <create-value value-name="newEntity"/>
>>
>> Many thanks,
>> Bruno
>>
>
>