[ http://jira.jboss.com/jira/browse/JBAS-56?page=history ] SourceForge User closed JBAS-56: --------------------------------
Resolution: Done > Nested Properties in CMP > ------------------------ > > Key: JBAS-56 > URL: http://jira.jboss.com/jira/browse/JBAS-56 > Project: JBoss Application Server > Type: Feature Request > Reporter: SourceForge User > Assignee: Scott M Stark > > > SourceForge Submitter: vharcq . > I would like to add a small (well a big for me) > feature to Entity EJB 1.1 in > CMP mode. > Dirk Zimmermann has already make some changes for that > and I would like to > extend them. > I also would like your opinion on that. > We could call it "Nested Properties in CMP". > Current State > ------------- > When we define cmp-field, they are saved into a > corresponding field in the > database. If the original java type is primitive, it > is transform to sql > type. If the original java type is not, it is > serialized and saved as > object. > When you read the database not from EJB, you need to > deserialize the object > to get its value. Not a problem with JDBC but when > you want to access the > database in other ways, you got stuck. > Dirk Improvement > ---------------- > The goal of Dirk (AFAIK) was in the case of one bean B > reference Primary Key > of bean A as a field. Dirk wanted to also stored > the "inside" fields of the > A Primary Key as primitive type when they are. In > fact they almost always > are. One Primary Key class is often one (or multiple) > primitive type like > an "int" for example. > So he added the possibility to add in jaws.xml > <cmp-field> > <field-name>apk.id</field-name> > <column-name>apkid</column-name> > </cmp-field> > In this case both apk is serialized AND the id inside > apk is saved as > integer in a new field. > Then very easy now to sql JOIN two tables. > Very nice indeed :) > Wanted Improvement > ------------------ > Extend that to any "non-primitive" cmp-field. > If I have an Address as a cmp-field, I may want > to "explode" it in multple > primitive fields street, city, zip, country and save > these fields instead of > serializing Address. > The workaround to do that today is to have all Address > attributes as EJB > cmp-fields and implement a Address getAddress() method > inside the bean, > declare it in the remote interface, ... very borring > in fact, not OO, and I > am very lazzy too. > If you change Address, you have to review all EJB that > use Address, beurk. > If you want a finder method on Zip code of Address, > you can not serialize > Address or if you do, you have to findAll() then verify > getAddress().getZip(), beurk. > I don't think this is against the 1.1 spec as the > 9.4.1 chapter is very > "vague". > I also don't think it go against 2.0 spec as this is > really not in conflict > with Dependant Objects which are more complex that my > case. (in D.O. the > address could be shared by two entity beans for > example, or stored in > another table). > The biggest warrning to make I think is regarding > chapter 9.2 of the spec > 2.0 which says : > " When designing an entity bean with container > managed persistence, the > Bean Provider must be mindful > of the distinction between the client view of > the entity bean and the > entity beans view of its persistent > state. In particular, there need be no direct > relationship between the two. > While the EJB component > model provides a separation between the client > view of a bean (as presented > by its home and remote > interfaces) and the entity bean instance > (which provides the implementation > of the client view), the EJB > architecture for container managed persistence > adds to this a separation > between the entity bean > instance (as defined by the bean provider) and > its persistent state." > I really think this improvement does not go against > that because I am > focusing on very basic views : Address, Quantity, ... > The kind of fields that you do not want to transform > each time in the EJB to > provide a client with its own view. > A Quantity is a Quantity ! for both server side > componants and client side > components. For the Address example, it depends of > what you want to do with > the Address, right. But if you know what you are > doing . . . > How I plan to do it > ------------------- > I would like to do that without changing the default > behavior, so my ejb-jar > remains unchanged and define Address as the cmp- > field. (This is what I want > to "publish" in my get/set in the remote interface). > The changes would > appear in jaws.xml. > 1. If I do not specify anything, Address is still > serialized as before. > 2. If I specify Address, Address is still serialized > as before. > 3. If I add Address.zip like this > <cmp-field> > <field-name>address.zip</field-name> > <column-name>addresszip</column-name> > </cmp-field> > I will have both Address Serialized and Address.zip > saved in 2 columns. > Address remains the important data (If I change > Address my sql, my EJB show > the change - If I change addresszip by SQL then my EJB > do not see anything). > This would be helpful for "Catalog" pattern sort of > things in Read Only SQL > only. > 4. If I tell Jaws that Address is "exploded", then > Address will be > reconstruct from its different fields. > Address would be exploded if I do not specify any > <column-name> for it. > <cmp-field> > <field-name>address</field-name> > <column-name></column-name> > </cmp-field> > <cmp-field> > <field-name>address.street</field-name> > <column-name>addr-treet</column-name> > </cmp-field> > <cmp-field> > <field-name>address.zip</field-name> > <column-name>zip</column-name> > </cmp-field> > If I forgot (as in this example) to map some fields, > they will be mapped by > default to > address_fieldname > I tell Jaws to explode a cmp-field by not specifying a > column-name for it. > IMHO that's a simple trick that will permit to > transform a lot of code > working now with a minimum amount of change. (I am an > addict to ejbdoclet > and I ant to keep this change as transparent as > possible). > 5. This has to work recursively and automatically for > nested properties. > If Address and a street property which is himself 3 > String line1, line2, > line3, > Then I only have to specify > <cmp-field> > <field-name>address</field-name> > <column-name></column-name> > </cmp-field> > And I will get in my database > address_street_line1 > address_street_line2 > address_street_line3 > address_zip > address_city > address_country > So per default I automatically explode the nested > properties. Not > automatically for the first field to keep the standard > behaviour. > 6. Yes you have to create a jaws.xml to make it work! > I do not use them and > try to make jaws work per default most of the time. > Maybe a flag in > standardjaws.xml would be an idea. > <explode-nested-properties> > true > </explode-nested-properties> > This would make (5) work without having to write a > jaws.xml. > But maybe it is going too far. > 7. Finder Methods > They will work better with this! > You can now have a findByZip(String zip) method on the > bean. > findByAddress() is no more possible but not needed as > well. > For the Quantity object, if it has a double value and > a String unit, you > could now have a findByUnit() > [Future] Arrays and Collections > ------------------------------- > This could be extended for Arrays (and Collections). > Here I face the problem that Array is not a SQL > standard (I have seen them > in Postgres but not in Hypersonic) > If an cmp-field is an Array and the database allows > Arrays, it should be > possible to map these fields to SQL arrays and not > Serialize them. > If Address define String[] street, today it is > serialized, I would like to > create a VARCHAR[] field in compliant database instead. > This is for the future as it will require a lot more > work to verify all > supported databases and I am not really sure I am > going too far here. . . > Please give your opinion. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa - If you want more information on JIRA, or have a bug to report see: http://www.atlassian.com/software/jira ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://productguide.itmanagersjournal.com/ _______________________________________________ JBoss-Development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development