title: JPA @OneToOne throws Error when mapped to an abstract @Entity with subclasses
body: <p>I have a problem when an Entity is mapped to another Entity which has a direct implementation on its subclasses. See sample mapping below:</p>
  
  <pre><code>@Entity
  class Location {
        @OneToOne
        @JoinColumn(...)
        private Person person;
  }
  
  @Entity
  @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
  @DiscriminatorColumn(name="person_type",discriminatorType=DiscriminatorType.STRING)
  abstract class Person {
  }
  
  @Entity
  @DiscriminatorValue("M")
  class Man extends Person {
      ...
  }
  
  @Entity
  @DiscriminatorValue("W")
  class Woman extends Person {
      ...
  }
  </code></pre>
  
  <p>Now, this is what I have on my database table:</p>
  
  <p>location-table:
  id=1, person_id=1
  person-table:
  id=1,person_type="M"</p>
  
  <p>When I retrieve the Location using entity manager, hibernate throws an exception saying that i cannot instantiate an abstract class or an interface.</p>
  
  <pre><code>Location location = entityManager.find(Location.class, 1L);
  </code></pre>
  
  <p>Hibernate throws this error:</p>
  
  <pre><code>javax.persistence.PersistenceException: org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: Person
  at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:630)
  at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:195)
  at ......
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:585)
  at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
  at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
  at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runTestMethod(UnitilsJUnit4TestClassRunner.java:174)
  at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
  at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
  at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:156)
  at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
  at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
  at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:95)
  at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
  at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:44)
  at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:62)
  at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
  at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
  at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:68)
  at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
  at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
  </code></pre>