Lots of great stuff here, Oscar ... thanks! Cheers Dan
On 9 October 2015 at 13:16, Óscar Bou - GOVERTIS <o....@govertis.com> wrote: > Hi again, Cesar. > > Reading again your post, seems you’ve explicitly modeled the vendor-item > m:n relationship, introducing a new VendorItem entity. > > That would not be needed if using m:n relationships. > > You directly reference the other Entity on each SortedSet (if they’re > bi-directional). > > > You could have something like: > > > public class Vendor { > > // {{ Items (Collection) > @Persistent(table = "Vendor_Item") > @Join(column = "Vendor") > @Element(column = "Item") > private SortedSet<Item> items = new TreeSet<Item>(); > > public SortedSet<Item> getItems() { > return items; > } > > public void setItems( > final SortedSet<Item> items) { > this.items = items; > } > // }} > > } > > > public class Item { > > // {{ Vendors (Collection) > @Persistent(mappedBy = "items") > private SortedSet<Vendor> vendors = new TreeSet<Vendor>(); > > public SortedSet<Vendor> getVendors() { > return vendors; > } > > public void setVendors( > final SortedSet<Vendor> vendors) { > this.vendors = vendors; > } > // }} > > } > > > As the SortedSets contain “Vendor” and “Item” entities, I assume they > already implement the Comparable interface. > > If you introduce the VendorItem entity, it can be persisted by DN using > Foreign Keys if defined as follows: > > public class Vendor { > > // {{ SoldItems (Collection) > @Persistent(mappedBy = "vendor", dependentElement = "true") > private SortedSet<VendorItem> soldItems = new TreeSet<VendorItem>(); > > public SortedSet<VendorItem> getSoldItems() { > return soldItems; > } > > public void setSoldItems( > final SortedSet<VendorItem> soldItems) { > this.soldItems = soldItems; > } > // }} > > } > > public class Item { > > // {{ SoldByVendors (Collection) > @Persistent(mappedBy = "item", dependentElement = "true") > private SortedSet<VendorItem> soldByVendors = new > TreeSet<VendorItem>(); > > public SortedSet<VendorItem> getSoldByVendors() { > return soldByVendors; > } > > public void setSoldByVendors( > final SortedSet<VendorItem> soldByVendors) { > this.soldByVendors = soldByVendors; > } > // }} > > } > > Please, notice in previous example I’ve called the properties “soldItems” > and “soldByVendors”, as they’re returning “VendorItem” and not “Vendor” or > “Item” entities. > So it’s a new Entity introduce, that might be named properly (perhaps > “SoldItem” or similar?). > > As the relationship has been explicitly modeled as a new Entity (perhaps > with its properties and domain logic associated), it needs to implement > Comparable. > > > > You also told don’t want foreign keys. > DataNucleus also allows you to model the previous case with Join tables > something like this (despite I’ve never used it. We always use Foreign > Keys): > > > public class Vendor { > > > // {{ Item (Collection) > @Persistent(mappedBy = "vendor", dependentElement = "true") > @Join > private SortedSet<Item> items = new TreeSet<Item>(); > > public SortedSet<Item> getItem() { > return items; > } > > public void setItem( > final SortedSet<Item> items) { > this.items = items; > } > // }} > > } > > > > HTH, > > Oscar > > > > > > El 9 oct 2015, a las 9:55, Óscar Bou - GOVERTIS <o....@govertis.com> > escribió: > > > > > > Hi Cesar. > > > > As Dan points out, m:n relationships are only useful when the "link" > does not have associated attributes or domain logic associated. > > We have use cases similar to yours. Many times there's a hidden "entity" > there with its own meaning, and just sometimes we simply model it as an m:n > relationship. > > > > HTH, > > > > Oscar > > > > > >> El 9 oct 2015, a las 1:38, Cesar Lugo <cesar.l...@sisorg.com.mx> > escribió: > >> > >> Hi Dan, > >> > >> First of all ... Wow! is this not only the fastest Domain Driven > development framework , but also the one with the quickest response support > team? :) Second, I am honored to get a response from you, I have read a lot > about your great work and commitment to Apache ISIS and Naked Objects, and > excellent tutorials, demos and add-ons. Congratulations! > >> > >> So I will work on your suggestions and let you know. Thank you so much! > >> > >> Cesar. > >> > >> -----Original Message----- > >> From: Dan Haywood [mailto:d...@haywood-associates.co.uk] > >> Sent: Thursday, October 8, 2015 5:58 PM > >> To: users > >> Subject: Re: Apache ISIS relationships > >> > >> Hi Cesar, > >> > >> and welcome to users@isis.a.o mailing list. > >> > >> A few thoughts on this... > >> > >> ... first suggestion: you ought to be able to map this relationship as > an > >> m:n, rather than as two 1:m and n:1 relationships. I must admit I > don't > >> do that in Estatio, but Oscar has done it I believe, because he > included the m:n relationship in the set of templates he developed for > IntelliJ / Eclipse [1]. I think the ones you want are called > "iscs.jdo.mn.ub.p" (Isis JDO m:n parent) and ""iscs.jdo.mn.ub.c" (Isis JDO > m:n child). > >> > >> There's also info on m:n relationships at the Datanucleus site [2]. So > far as possible Isis isn't responsible for persistence, that is delegated > to DataNucleus ... so if it's a feature of DN then it *should* "just work" > in Isis. > >> > >> > >> ... second suggestion: if you do decide to have a link item table, then > you could use the foreign references to Vendor and to Item, eg > ObjectContracts.compareTo(this, "vendor", "item"). I'm not sure I > recommend this, though, because it will require the referenced objects to > be loaded in order to do a comparison, which could impact performance > >> > >> > >> ... third suggestion: do a bit more domain modelling. I suspect that, > over time, you will find attributes/responsibilities that live on the link > entity, and it probably has a more meaningful name than just "VendorItem". > >> If it represents the fact that a vendor can sell an item, then > presumably it has a cost, and perhaps a discount, and maybe a target > profitability, and perhaps a wholesale supplier from which the vendor > purchases it in turn. This is the reason we have no m:n relationships in > Estatio ... > >> there's almost always something interesting to say about that > relationship. > >> > >> HTH, > >> > >> Dan > >> > >> > >> > >> [1] http://isis.apache.org/guides/cg.html#_cg_ide-templates > >> [2] > >> > http://www.datanucleus.org/products/accessplatform/jdo/orm/many_to_many.html > >> > >> > >> > >> > >>> On 8 October 2015 at 23:27, Cesar Lugo <cesar.l...@sisorg.com.mx> > wrote: > >>> > >>> Hello again! > >>> > >>> > >>> > >>> I have created an Apache ISIS prototype application, and in some cases > >>> I need to have some Domain Entities that do not have any properties > >>> other than references to other Domain Entities, for example, used just > >>> to build Many-to-Many relationships among 2 Domain Entities (I am not > >>> using foreign keys). For example, a Vendor can sell us many Items, and > >>> an Item can be purchased by many Vendors. So I define a VendorItem > >>> entity, which has a property to reference Item and Vendor entities > >>> within it. Everything works fine, until I get to the collections > >>> (using SortedSet) on Item and on Vendor to list all VendorItem > >>> relationships either from Item or from Vendor. In that case, because > >>> VendorItem needs to be implemented using a Comparable class, it > >>> requires a field for the CompareTo method. The only way I have been > >>> able to work around it is to declare a property (vendorItemId) that I > >>> don't really need, and populate it manually every time I create a new > >>> VendorItem relationship. Is there a way to avoid using such a > >>> (vendorItemId) > >>> property, or use the automatic "id" field generated by the JPO > >>> idGeneratorStrategy.IDENTITY column = "id" annotation?. Or, is there > >>> any other better way to manage Many-To-Many relationships using Apache > >>> ISIS and JPO? > >>> > >>> > >>> > >>> Cesar. > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> --- > >>> This email has been checked for viruses by Avast antivirus software. > >>> https://www.avast.com/antivirus > >> > >> > >> --- > >> This email has been checked for viruses by Avast antivirus software. > >> https://www.avast.com/antivirus > >> > >