[ http://thecla.homeftp.net:8380/jira/browse/HIB-48?page=comments#action_10843 ] Chad Brandon commented on HIB-48: ---------------------------------
Moved to the hibernate cartridge since spring will soon be using hibernate and hibernate has the same issue. > Hibernate <joined-subclass> mapping generates superfluous *.hbm.xml files > ------------------------------------------------------------------------- > > Key: HIB-48 > URL: http://thecla.homeftp.net:8380/jira/browse/HIB-48 > Project: Hibernate Cartridge > Type: Bug > Reporter: Matthias Bohlen > Assignee: Chad Brandon > > > Let's assume the user has three entities A, B, C where B and C specialize A. > When a user sets the inheritance mapping strategy to "subclass" (which really > means <joined-subclass>) then the Spring cartridge correctly generates > A.hbm.xml with > <class name="AImpl" table="A"> > <joined-subclass name="BImpl" table="B"> > ... > </joined-subclass> > <joined-subclass name="CImpl" table="C"> > ... > </joined-subclass> > </class> > BUT: it also generates additional, superfluous files B.hbm.xml and C.hbm.xml! > Hibernate schema mapper complains about "duplicate imports" for BImpl and > CImpl. > Looking at the code for SpringEntityLogicImpl, there is a complex method that > tries to guess whether a .hbm.xml file needs to be written or not: > <code> > protected boolean handleIsRootInheritanceEntity() > { > boolean result = false; > GeneralizableElementFacade superElement = this.getGeneralization(); > if (superElement == null) > { > String inheritance = this.getInheritance(this); > // We are a root if we are the base class and not interface > // inheritance > result = (inheritance == null) > || !inheritance.equals(INHERITANCE_STRATEGY_INTERFACE); > } > else > { > // We are a subclass > GeneralizableElementFacade root = getRootInheritanceEntity(); > String inheritance = getInheritance(root); > // Are we the subclass element > result = root.getFullyQualifiedName().equals( > getFullyQualifiedName()); > if (!result && inheritance != null > && inheritance.equals(INHERITANCE_STRATEGY_SUBCLASS)) > { > // If not check if we are a subclass > result = superElement.getFullyQualifiedName().equals( > root.getFullyQualifiedName()); > } > } > return result; > } > </code> > The bug seems to be in this method (I think it is somewhere in the "else" > clause). > HOWEVER: I suggest to throw away this method and ALWAYS write one .hbm.xml > file per class, using a different syntax. This syntax allows to use > <subclass> and <joined-subclass> mapping elements in a separate mapping file > (as a top level element, instead of <class>). You then have to declare the > class that is extended (for example write a new file B.hbm.xml with: > <subclass name="B" extends="A"> > ... > </subclass> > This would be MUCH simpler, you can also throw away the > getRootInheritanceEntity() method altogether. The price for this is: at > runtime, you have to load A.hbm.xml *before* B.hbm.xml and C.hbm.xml. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://thecla.homeftp.net:8380/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://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ Andromda-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/andromda-devel
