-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: OneToMany in Composite PK Entity causes PropertyAccessExcept
PostPosted: Sat Oct 18, 2008 8:40 am 
Regular
Regular

Joined: Thu Sep 06, 2007 2:22 am
Posts: 108
Location: Noida,India
I am using Hibernate Core-3.2.4sp1 and Hibernate Annotation - 3.2.0 GA.

I need to create @OneToMany join between two tables using join on two non-directly related columns.

I've tried to simplify this code to illustrate the objective.


Code:
@Embeddable
public class StudentPK implements Serializable {

   private String studentName;

   private String fatherName;

   @Override
   public int hashCode() {
      String str = "" + this.studentName.hashCode()
            + this.fatherName.hashCode();
      return Integer.parseInt(str);
   }

   @Override
   public boolean equals(Object obj) {
      if (obj == null || !(obj instanceof StudentPK)) {
         return false;
      } else {
         StudentPK studentPK = (StudentPK) obj;

         return this.studentName.equals(studentPK.studentName)
               && this.fatherName.equals(studentPK.fatherName);
      }
   }

   public String getStudentName() {
      return studentName;
   }

   public void setStudentName(String studentName) {
      this.studentName = studentName;
   }

   public String getFatherName() {
      return fatherName;
   }

   public void setFatherName(String fatherName) {
      this.fatherName = fatherName;
   }

}

@Entity
@Table(name = "STUDENT")
public class Student implements Serializable{
   @Id
   @AttributeOverrides( {
         @AttributeOverride(name = "studentName", column = @Column(name = "STUDENT_NAME")),
         @AttributeOverride(name = "fatherName", column = @Column(name = "FATHER_NAME")) })
   private StudentPK studentPK;

   @Column(name = "CLASS_ID")
   private int classId;

   @OneToMany(fetch = FetchType.EAGER)
   @JoinColumn(name = "CLASS_ID", referencedColumnName = "CLASS_ID")
   Set<TimeTable> timeTable;

   public StudentPK getStudentPK() {
      return studentPK;
   }

   public void setStudentPK(StudentPK studentPK) {
      this.studentPK = studentPK;
   }

   public int getClassId() {
      return classId;
   }

   public void setClassId(int classId) {
      this.classId = classId;
   }

   public Set<TimeTable> getTimeTable() {
      return timeTable;
   }

   public void setTimeTable(Set<TimeTable> timeTable) {
      this.timeTable = timeTable;
   }

}

@Entity
@Table(name="TIME_TABLE")
public class TimeTable {
   
   @Id
   @Column(name="TIME_TABLE_ID")
   private int timeTableId;
   
   @Column(name="CLASS_ID")
   private int classId;

   public int getTimeTableId() {
      return timeTableId;
   }

   public void setTimeTableId(int timeTableId) {
      this.timeTableId = timeTableId;
   }

   public int getClassId() {
      return classId;
   }

   public void setClassId(int classId) {
      this.classId = classId;
   }
}


When i tried to execute simple HQL query " FROM Student ", it throw the following error -


Code:
org.hibernate.PropertyAccessException: could not get a field value by reflection getter of StudentPK.studentName
   at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:35)
   at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:64)
   at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:70)
   at org.hibernate.tuple.component.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:83)
   at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:353)
   at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:184)
   at org.hibernate.engine.EntityKey.generateHashCode(EntityKey.java:104)
   at org.hibernate.engine.EntityKey.<init>(EntityKey.java:48)
   at org.hibernate.engine.StatefulPersistenceContext.getCollectionOwner(StatefulPersistenceContext.java:675)
   at org.hibernate.loader.Loader.readCollectionElement(Loader.java:993)
   at org.hibernate.loader.Loader.readCollectionElements(Loader.java:646)
   at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:591)
   at org.hibernate.loader.Loader.doQuery(Loader.java:701)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
   at org.hibernate.loader.Loader.loadCollection(Loader.java:1994)
   at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
   at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
   at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
   at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
   at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:454)
   at org.hibernate.engine.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:794)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:241)
   at org.hibernate.loader.Loader.doList(Loader.java:2220)
   at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
   at org.hibernate.loader.Loader.list(Loader.java:2099)
   at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
   at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
   at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
   at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
   at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
   at com.gehciits.cpn.dps.DummyTest.testing(DummyTest.java:30)
   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 junit.framework.TestCase.runTest(TestCase.java:154)
   at junit.framework.TestCase.runBare(TestCase.java:127)
   at com.gehciits.cpn.dps.CpnJavaTestCase.runBare(CpnJavaTestCase.java:29)
   at junit.framework.TestResult$1.protect(TestResult.java:106)
   at junit.framework.TestResult.runProtected(TestResult.java:124)
   at junit.framework.TestResult.run(TestResult.java:109)
   at junit.framework.TestCase.run(TestCase.java:118)
   at junit.framework.TestSuite.runTest(TestSuite.java:208)
   at junit.framework.TestSuite.run(TestSuite.java:203)
   at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
   at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.IllegalArgumentException
   at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
   at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:18)
   at java.lang.reflect.Field.get(Field.java:357)
   at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:32)
   ... 49 more


I executed same query after changing Hibernate Annotation to 3.3.1 GA ( but without changing Hibernate Core version. Error remains persist, only error message get change. Now Error message become -

Code:
org.hibernate.PropertyAccessException: could not get a field value by reflection getter of StudentPK.fatherName
   at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:35)
   at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:64)
   at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:70)
   at org.hibernate.tuple.component.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:83)
   at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:353)
   at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:184)
   at org.hibernate.engine.EntityKey.generateHashCode(EntityKey.java:104)
   at org.hibernate.engine.EntityKey.<init>(EntityKey.java:48)
   at org.hibernate.engine.StatefulPersistenceContext.getCollectionOwner(StatefulPersistenceContext.java:675)
   at org.hibernate.loader.Loader.readCollectionElement(Loader.java:993)
   at org.hibernate.loader.Loader.readCollectionElements(Loader.java:646)
   at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:591)
   at org.hibernate.loader.Loader.doQuery(Loader.java:701)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
   at org.hibernate.loader.Loader.loadCollection(Loader.java:1994)
   at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
   at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
   at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
   at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
   at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:454)
   at org.hibernate.engine.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:794)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:241)
   at org.hibernate.loader.Loader.doList(Loader.java:2220)
   at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
   at org.hibernate.loader.Loader.list(Loader.java:2099)
   at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
   at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
   at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
   at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
   at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
   at com.gehciits.cpn.dps.DummyTest.testing(DummyTest.java:30)
   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 junit.framework.TestCase.runTest(TestCase.java:154)
   at junit.framework.TestCase.runBare(TestCase.java:127)
   at com.gehciits.cpn.dps.CpnJavaTestCase.runBare(CpnJavaTestCase.java:29)
   at junit.framework.TestResult$1.protect(TestResult.java:106)
   at junit.framework.TestResult.runProtected(TestResult.java:124)
   at junit.framework.TestResult.run(TestResult.java:109)
   at junit.framework.TestCase.run(TestCase.java:118)
   at junit.framework.TestSuite.runTest(TestSuite.java:208)
   at junit.framework.TestSuite.run(TestSuite.java:203)
   at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
   at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.IllegalArgumentException
   at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
   at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:18)
   at java.lang.reflect.Field.get(Field.java:357)
   at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:32)
   ... 49 more



Two interesting finding from my side. This error doesn't occur if any one of following condition happen-

1. Table "TIME_TABLE" (mapped to entity TimeTable) doesn't have any data.

2.if i remove "timeTable" associationd from entity Student.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.