Hi Riccardo,

There is also a validateForSave() that might be easier (handles inserts and
updates).

mrg


On Wed, Jan 10, 2024 at 8:34 AM Michael Gentry <blackn...@gmail.com> wrote:

> Hi Riccardo,
>
> The To Dep PK checkbox on the DbEntity isn't really intended to say "this
> relationship is required" (that is a by-product). It is designed to assign
> a PK from one entity to another.
>
> Perhaps use a Pre-Persist Callback (ObjEntity tab) to verify the shipment
> has a shipment number?
>
>
> https://cayenne.apache.org/docs/4.1/cayenne-guide/#types-of-lifecycle-events
>
> You could also use validateForInsert() I think, but you should also maybe
> do a validateForUpdate() if you go down that path.
>
> mrg
>
>
> On Wed, Jan 10, 2024 at 6:50 AM Riccardo De Menna <deme...@tuorlo.net>
> wrote:
>
>> Hi Michael,
>>
>> > Try deselecting the "To Dep PK" checkbox on the relationship
>> > in SHIPMENT_NUMBER -> SHIPMENT.
>>
>> I tryed both ToDep directions but they don’t seem to affect the result.
>> >
>> > I can see how having that checked would make the relationship required
>> > because it ties SHIPMENT_NUMBER's PK to SHIPMENT's PK, therefore a
>> > SHIPMENT_NUMBER shouldn't exist without a corresponding SHIPMENT and it
>> > sounds like you want it to be separate.
>>
>> But I do expect the reverse relationship to be required… As I undrestood
>> it, I would set ToDepPK on the SHIPMENT_NUMBER side and keep it off on the
>> SHIPMENT side. I want to be able to generate numbers before having to link
>> them to shipments but I also expect shipments non to exist without a number.
>>
>> BTW, as I said to Nikita, if I forcefully ignore the flag and manually
>> bypass my validation code depending on it, the ObjectContext does not seem
>> to complain about it and does commit the save.
>>
>> I assume it’s just the flag being marked as mandatory for some other side
>> condition but I still don’t know what to use in the template as a reliable
>> replacement.
>>
>> Riccardo
>>
>> >
>> > mrg
>> >
>> >
>> > On Wed, Jan 10, 2024 at 12:10 AM Riccardo De Menna <deme...@tuorlo.net>
>> > wrote:
>> >
>> >> Hi Michael,
>> >>
>> >> Thank you for helping. Yes… you modeled exactly what I described down
>> to
>> >> the delete rules. I imported your files in modeler and run class
>> generation
>> >> but I still get the relationship (TO_SHIP in your model) to appear as
>> >> mandatory. Could it be an issue in class generation?
>> >>
>> >> This is a little VE snippet I use in my template to output a static
>> list
>> >> of mandatory relationships.
>> >>
>> >> #foreach( $rel in ${object.DeclaredRelationships} )
>> >>  #if (${rel.isMandatory()} && !${rel.ToMany} )
>> >>    #set($bar =
>> >>
>> $requiredRelationships.add("${stringUtils.capitalizedAsConstant($rel.Name)}_PROPERTY"))
>> >>  #end
>> >> #end
>> >> public static final List<String> REQUIRED_RELATIONSHIPS = List.of(
>> >>  #foreach( $rel in ${requiredRelationships} )
>> >>    ${rel}#if(!$foreach.last),#end
>> >>  #end
>> >> );
>> >>
>> >> And contrary to what I would expect, I get this in my superclass:
>> >>
>> >> public static final List<String> REQUIRED_RELATIONSHIPS = List.of(
>> >>  TO_SHIP_PROPERTY
>> >> );
>> >>
>> >> Riccardo De Menna
>> >>
>> >>
>> >>> On 10 Jan 2024, at 01:20, Michael Gentry <blackn...@gmail.com> wrote:
>> >>>
>> >>> Hi Riccardo,
>> >>>
>> >>> I may have completely misunderstood your intention, but here is my
>> first
>> >>> cut for a model:
>> >>>
>> >>> cayenne-o2o.xml:
>> >>> <?xml version="1.0" encoding="utf-8"?>
>> >>> <domain xmlns="http://cayenne.apache.org/schema/10/domain";
>> >>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>> >>> xsi:schemaLocation="http://cayenne.apache.org/schema/10/domain
>> >>> https://cayenne.apache.org/schema/10/domain.xsd";
>> >>> project-version="10">
>> >>> <map name="datamap"/>
>> >>> </domain>
>> >>>
>> >>> datamap.map.xml:
>> >>> <?xml version="1.0" encoding="utf-8"?>
>> >>> <data-map xmlns="http://cayenne.apache.org/schema/10/modelMap";
>> >>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>> >>> xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap
>> >>> https://cayenne.apache.org/schema/10/modelMap.xsd";
>> >>> project-version="10">
>> >>> <property name="defaultLockType" value="1"/>
>> >>> <property name="defaultPackage" value="org.test"/>
>> >>> <db-entity name="SHIPMENT">
>> >>> <db-attribute name="ID" type="BIGINT" isPrimaryKey="true"
>> >> isMandatory="true"
>> >>> />
>> >>> </db-entity>
>> >>> <db-entity name="SHIPMENT_NUMBER">
>> >>> <db-attribute name="ID" type="BIGINT" isPrimaryKey="true"
>> >> isMandatory="true"
>> >>>>
>> >>> <info:property xmlns:info="http://cayenne.apache.org/schema/10/info";
>> >> name=
>> >>> "comment" value="This ID is the same as SHIPMENT&apos;s ID."/>
>> >>> </db-attribute>
>> >>> <db-attribute name="NUM" type="INTEGER">
>> >>> <info:property xmlns:info="http://cayenne.apache.org/schema/10/info";
>> >> name=
>> >>> "comment" value="This is the shipment number."/>
>> >>> </db-attribute>
>> >>> </db-entity>
>> >>> <obj-entity name="Shipment" className="org.test.Shipment" lock-type=
>> >>> "optimistic" dbEntityName="SHIPMENT"/>
>> >>> <obj-entity name="ShipmentNumber" className="org.test.ShipmentNumber"
>> >>> lock-type="optimistic" dbEntityName="SHIPMENT_NUMBER">
>> >>> <obj-attribute name="num" type="java.lang.Integer"
>> >> db-attribute-path="NUM"/>
>> >>> </obj-entity>
>> >>> <db-relationship name="toShipNum" source="SHIPMENT"
>> >> target="SHIPMENT_NUMBER"
>> >>>>
>> >>> <db-attribute-pair source="ID" target="ID"/>
>> >>> </db-relationship>
>> >>> <db-relationship name="toShip" source="SHIPMENT_NUMBER"
>> target="SHIPMENT"
>> >>> toDependentPK="true">
>> >>> <db-attribute-pair source="ID" target="ID"/>
>> >>> </db-relationship>
>> >>> <obj-relationship name="toShipNum" source="Shipment"
>> >> target="ShipmentNumber"
>> >>> deleteRule="Cascade" db-relationship-path="toShipNum"/>
>> >>> <obj-relationship name="toShip" source="ShipmentNumber"
>> target="Shipment"
>> >>> deleteRule="Deny" db-relationship-path="toShip"/>
>> >>> </data-map>
>> >>>
>> >>> Copy/Paste these files somewhere, then try loading them up into your
>> 4.2
>> >>> Modeler and see if it is close.
>> >>>
>> >>> mrg
>> >>>
>> >>>
>> >>> On Tue, Jan 9, 2024 at 9:54 AM Riccardo De Menna <deme...@tuorlo.net>
>> >> wrote:
>> >>>
>> >>>> Hi,
>> >>>>
>> >>>> Can someone help me understand something?
>> >>>>
>> >>>> I’m trying to model a one-to-one relationship between two entities
>> but I
>> >>>> can’t seem to get the relationship to be optional.
>> >>>>
>> >>>> In my specific case I need to model an entity representing shipments
>> >> with
>> >>>> a postal service. Each shipment needs to have a number taken from a
>> >>>> range/group that is pre-assigned by the postal service.
>> >>>>
>> >>>> Thus I created a SHIPMENT_NUMBER entity with just an INTEGER
>> attribute
>> >> and
>> >>>> then used that attribute to build the relationship with the SHIPMENT
>> >>>> entity. Possibly with “To dep PK” as well.
>> >>>>
>> >>>> I want the relationship to be optional so that I can generate
>> >>>> SHIPMENT_NUMBER as many as I want and populate them with the numbers
>> >>>> assigned by the postal service and only later, when the real
>> SHIPMENT is
>> >>>> actually needed/created, link it with the number in a one-to-one
>> >> fashion.
>> >>>>
>> >>>> I’m not sure why, but my class generated content always shows the
>> >>>> relationship as mandatory.
>> >>>>
>> >>>> Coming from the WebObjects world, I'm used to a modeler that
>> explicitly
>> >>>> shows checkboxes for isMandatory on relationships like with the
>> >> attributes.
>> >>>> Here in Cayenne it seems that optionality is implicitly determined
>> >> based on
>> >>>> the design.
>> >>>>
>> >>>> Have I misunderstood something? Is my design flawed?
>> >>>>
>> >>>> Any tip is appreciated.
>> >>>>
>> >>>> Regards,
>> >>>> Riccardo
>> >>
>> >>
>>
>>

Reply via email to