Hi, We have two tables Assay and Project and one Project has many assays. The schema is given below.
Schema for Assay_Test (Assay) PRIMARY_KEY NUMBER(10,0) COLLECTION_KEY NUMBER(10,0) ASSAY_NAME VARCHAR2(4000 BYTE) PROJECT_ID_FK VARCHAR2(4000 BYTE)
Schema for Project_Test (Project) PRIMARY_KEY NUMBER(10,0) COLLECTION_KEY NUMBER(10,0) PROJECT_NAME VARCHAR2(4000 BYTE)
The relationship between Assay and Project is between 'PROJECT_ID_FK' of Assay and 'COLLECTION_KEY' of Project.Using Hibernate session with Annotations ,I assigned @DocumentID annotation to 'PRIMARY_KEY' of Assay and Project because it is unique. After this configuration when i run the program and try to fetch the list of Assays using Project object, I get the following error.
Message:com.entities.ProjectTest cannot be cast to java.math.BigDecimal java.lang.ClassCastException: com.entities.ProjectTest cannot be cast to java.math.BigDecimal at org.hibernate.type.BigDecimalType.getHashCode(BigDecimalType.java:71) at org.hibernate.type.AbstractType.getHashCode(AbstractType.java:144) at org.hibernate.engine.EntityKey.generateHashCode(EntityKey.java:126) at org.hibernate.engine.EntityKey.<init>(EntityKey.java:70) at org.hibernate.engine.StatefulPersistenceContext.getCollectionOwner(StatefulPersistenceContext.java:733) at org.hibernate.loader.Loader.readCollectionElement(Loader.java:1037) at org.hibernate.loader.Loader.readCollectionElements(Loader.java:690) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:630) at org.hibernate.loader.Loader.doQuery(Loader.java:745) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270) at org.hibernate.loader.Loader.loadCollection(Loader.java:2062) at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:62) at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:628) at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83) at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1853) at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:369) at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111) at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:186) at Main.search2(Main.java:133) at Main.main(Main.java:48)
The error occurs at the following code snippet Set<AssayTest> list=project.getAssayTests(); for (AssayTest assay:list){ System.out.println("assay name from project" +assay.getAssayName()); }
If i change the @DocumentID to 'COLLECTION_KEY' of Project, the error vanishes and program runs fine.However i can't make 'Collection_KEY' as @DocumentID because it is not unique for data in our production server.Only Primary_key is unique. so is there any restriction in Hibernate Search that you have to annotate @DocumentID to an attribute that has been used in specifying relationship between the entities.Is there any workaround this limitation?. Any help or comments would be appreciated. Thanks, Ali
Here is the Assay_Test Entity
/** * The persistent class for the ASSAY_TEST database table. * */ @Indexed @Entity @Table(name="ASSAY_TEST") public class AssayTest implements Serializable { private static final long serialVersionUID = 1L; @Field @Column(name="ASSAY_NAME", length=4000) private String assayName; @Field @Column(name="COLLECTION_KEY", precision=10) private BigDecimal collectionKey; @Id @DocumentId @Field @Column(name="PRIMARY_KEY", precision=10) private BigDecimal primaryKey;
//bi-directional many-to-one association to ProjectTest @NotFound(action=NotFoundAction.IGNORE) @ManyToOne @JoinColumn(name="PROJECT_ID_FK", referencedColumnName="COLLECTION_KEY") private ProjectTest projectTest;
public AssayTest() { }
public String getAssayName() { return this.assayName; }
public void setAssayName(String assayName) { this.assayName = assayName; }
public BigDecimal getCollectionKey() { return this.collectionKey; }
public void setCollectionKey(BigDecimal collectionKey) { this.collectionKey = collectionKey; }
public BigDecimal getPrimaryKey() { return this.primaryKey; }
public void setPrimaryKey(BigDecimal primaryKey) { this.primaryKey = primaryKey; }
public ProjectTest getProjectTest() { return this.projectTest; }
public void setProjectTest(ProjectTest projectTest) { this.projectTest = projectTest; }
}
Here is the Project_Test Entity
package com.entities;
/** * The persistent class for the PROJECT_TEST database table. * */ @Indexed @Entity @Table(name="PROJECT_TEST") public class ProjectTest implements Serializable { private static final long serialVersionUID = 1L; @Id @DocumentId @Field @Column(name="PRIMARY_KEY", precision=10) private BigDecimal primaryKey; @Field @Column(name="PROJECT_NAME", length=4000) private String projectName;
@Field @Column(name="COLLECTION_KEY") private String collectionKey; //bi-directional many-to-one association to AssayTest @NotFound(action=NotFoundAction.IGNORE) @OneToMany(mappedBy="projectTest") private Set<AssayTest> assayTests;
public ProjectTest() { }
public BigDecimal getPrimaryKey() { return this.primaryKey; }
public void setPrimaryKey(BigDecimal primaryKey) { this.primaryKey = primaryKey; }
public String getProjectName() { return this.projectName; }
public void setProjectName(String projectName) { this.projectName = projectName; }
public Set<AssayTest> getAssayTests() { return this.assayTests; }
public void setAssayTests(Set<AssayTest> assayTests) { this.assayTests = assayTests; }
public void setCollectionKey(String collectionKey) { this.collectionKey = collectionKey; }
public String getCollectionKey() { return collectionKey; }
}
|