title: Hibernate polymorphism
body: <p>This is a Hibnerate polymorphism question and a data model design
  question; they are intertwingled.  I've used Hibernate in the past,
  and have enjoyed it, but sometimes I find it difficult to think
  about anything but trivial designs.  Not a knock on Hibernate; just
  an observation that ORM in general can be challenging.</p>
  
  <p>I think this is a Hibernate 101 question, but I am not sure.  What I am trying to achieve may not even be possible.</p>
  
  <p>I have an abstract class Fruit that will be subclassed into Apple
  and Orange.  I have a Note class that represents notes or comments
  about Apples and Oranges.  An Apple or Orange can have many Notes
  associated with it, but only one Apple or Orange will ever be
  associated with a given Note.</p>
  
  <p>Here are sketches of the classes, where I am for now omitting where
  the object id's go, and the properties of Apples that distinguish
  them from Oranges.  For the time being, I don't feel strongly about which Hibernate inheritance strategy I use.  </p>
  
  <pre><code>abstract public class Fruit {
  }
  
  // Apples have notes written about them:
  public class Apple extends Fruit {
     private Set&lt;Note&gt; note;
     ...
  
     @OneToMany(cascade = CascadeType.ALL)
     public Set&lt;Note&gt; getNote() {
         return note;
     }
  }
  
  
  // Oranges have notes written about them:
  public class Orange extends Fruit {
     private Set&lt;Note&gt; note;
     ...
  
     @OneToMany(cascade = CascadeType.ALL)
     public Set&lt;Note&gt; getNote() {
         return note;
     }
  }
  </code></pre>
  
  <p>Here is the Note class currently implemented, wherein we see that 
  it has fields for both an Apple and an Orange.  The flaw or inelegance 
  in this design is that a single note instance will only point to
  one of Apple or Orange, and never both.  So if a Note is bound to 
  an Apple, the Orange field is superfluous and unsightly, and
  viceversa.</p>
  
  <pre><code>// A note about an Apple or Orange
  public class Note {
     private String theNote;
     private Apple apple; 
     private Orange orange;
     ...
  
     // with the usual many to one mapping
     @ManyToOne
     @JoinColumn(name = "apple_id")
     public Apple getApple() { 
         return apple;
     }
  
     // with the usual many to one mapping
     @ManyToOne
     @JoinColumn(name = "orange_id")
     public Orange getOrange() {
         return orange;
     }
  
     ...
  }
  </code></pre>
  
  <p>However, this is the Note class that I <em>think</em> I want to base my
  design on, but I'm not sure how to think about this with respect
  to Hibernate annotation and table mapping:</p>
  
  <pre><code>// A note about a fruit:
  public class Note {
     private String theNote;
     private Fruit fruit;
     ...
  }
  </code></pre>
  
  <p>whereupon fruit will be either an Apple or Orange instance.</p>
  
  <p>Can this latter Note class, with its reference to a Fruit, which will actually hold an Apple or Orange, even be reconciled with Hibernate ORM mapping?  If yes, can someone please talk about how.</p>