views:

197

answers:

1

According to the Grails GORM guide, subclasses of domain classes share the same table as the parent class unless tablePerHierarchy is set to false.

I cannot find information on whether the following mapping statement is ignored because of the "abstract" keyword

abstract class Item implements Comparable{
  static mapping = {
    tablePerHierarchy true
  }
...

My database contains no Item table, and one table per subclass (expected state for tablePerHierarchy==false).

Do I need to make Item concrete but disallow it in validation? I plan to have one ItemController with subclasses selected using a <select> in the create form.

+2  A: 

I'm sure you've come to some resolution of this already, but I ran into the same problem today, so I thought I would chime in.

In the Grails/Gorm documentation, section 5.2.3, it states that "GORM supports inheritance both from abstract base classes and concrete persistent GORM entities" (http://www.grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html).

Interestingly enough, they do not provide an example of an abstract class in the example for this section.

I tried, having an abstract class in my hierarchy, (both at the top of the hierarchy, and then further down one of the branches). Every time I attempted to persist an object that was a subclass of anything abstract, I got silent failure.

I first removed the abstract keyword from the top of the hierarchy, and I got more positive results. Finally, I removed the abstract keyword from all branches in the hierarchy, and everything worked fine.

So, my conclusion is, in practice, it is not true that you can use the abstract keyword in a Gorm hierarchy.

So my planned hierarchy was that of some simple data types for instance: abstract Type <- concrete Text <- concrete Url abstract Type <- abstract Numeric <- concrete Integral abstract Type <- abstract Numeric <- concrete Decimal

Had to become: concrete Type <- concrete Text <- concrete Url concrete Type <- concrete Numeric <- concrete Integral concrete Type <- concrete Numeric <- concrete Decimal

even though I have no intention of creating instances of Type, or Numeric directly.

For disclosure, I'm still using Grails 1.1.2 until I feel 1.2 is stable enough.

doug descombaz