lucene - Using Hibernate Search over 2 subclasess with a shared property -
i have following data model:
@entity @inheritance(strategy = inheritancetype.table_per_class) public abstract class abstractrecord implements serializable { ... @id @generatedvalue(strategy = generationtype.table) @column(name = "id", nullable = false) @documentid private integer id; ... }
@entity @inheritance(strategy = inheritancetype.table_per_class) @namedqueries(...) }) public abstract class abstractentrydetail extends abstractrecord implements serializable { ... }
@indexed(index = "entrydetailindex") @entity @table(name = "nacha_entry_detail") @namedqueries(...) }) public class entrydetail extends abstractentrydetail implements serializable { ... @field(index = index.tokenized, store = store.no) @column(name = "receiver_name", nullable = false) private string receivername; ...
}
@indexed(index = "entrydetailctxindex") @entity @table(name = "nacha_entry_detail_ctx") @namedqueries(...) public class entrydetailctx extends abstractentrydetail implements serializable { ... @field(index = index.tokenized, store = store.no) @column(name = "receiver_name", nullable = false) private string receivername; ... }
as can see, entrydetail , entrydetailctx share same property "receivername", having problem when searching value "individualname1" through following code:
@stateless @transactionattribute(transactionattributetype.mandatory) @rolesallowed({permissionutil.search_list, permissionutil.lucene_index }) public class searchfacade { ... @rolesallowed(permissionutil.search_list) @transactionattribute(transactionattributetype.required) public list<abstractrecord> dosearch(string stringtofind) { list<abstractrecord> result = null; // test search specific values of abstract record // aim return number of retreived results entitymanager em = emf.createentitymanager(); fulltextentitymanager fulltextentitymanager = org.hibernate.search.jpa.search.getfulltextentitymanager(em); string[] fields = // fields reviewed new string[] { ....,"receivername",.... }; //create multi-field lucene query standardanalyzer stdanalyzer = new standardanalyzer(version.lucene_30); multifieldqueryparser parser = new multifieldqueryparser(version.lucene_30, fields, stdanalyzer); org.apache.lucene.search.query query = null; try { query = parser.parse(stringtofind); } catch (parseexception ex) { logger.getlogger(searchfacade.class.getname()).log(level.severe, null, ex); } long time1 = system.currenttimemillis(); // wrap lucene query in javax.persistence.query javax.persistence.query persistencequery = fulltextentitymanager.createfulltextquery(query); // execute search //having problems here result = (list<abstractrecord>) persistencequery.getresultlist(); long time2 = system.currenttimemillis(); logger.getlogger(searchfacade.class.getname()) .log( level.finer, "hibernate search execution time: {0}", long.tostring(time2 - time1)); //em.gettransaction().commit(); em.close(); return result; }
so after indexing entities , trying perform search on "receivername" shared on data base, "jhon" following exception..
caused by: org.hibernate.wrongclassexception: object id: 1 not of specified subclass: com.xxx.ejb.core.entity.nacha.entrydetailctx (loaded object of wrong class class com.xxx.ejb.core.entity.nacha.entrydetail) @ org.hibernate.loader.loader.instancealreadyloaded(loader.java:1391) @ org.hibernate.loader.loader.getrow(loader.java:1344) @ org.hibernate.loader.loader.getrowfromresultset(loader.java:611) @ org.hibernate.loader.loader.doquery(loader.java:829) @ org.hibernate.loader.loader.doqueryandinitializenonlazycollections(loader.java:274) @ org.hibernate.loader.loader.dolist(loader.java:2533) @ org.hibernate.loader.loader.listignorequerycache(loader.java:2276) @ org.hibernate.loader.loader.list(loader.java:2271) @ org.hibernate.loader.criteria.criterialoader.list(criterialoader.java:119) @ org.hibernate.impl.sessionimpl.list(sessionimpl.java:1716) @ org.hibernate.impl.criteriaimpl.list(criteriaimpl.java:347) @ org.hibernate.search.engine.objectloaderhelper.initializeobjects(objectloaderhelper.java:116) @ org.hibernate.search.engine.multiclassesqueryloader.executeload(multiclassesqueryloader.java:124) @ org.hibernate.search.engine.abstractloader.load(abstractloader.java:70) @ org.hibernate.search.query.fulltextqueryimpl.list(fulltextqueryimpl.java:317) @ org.hibernate.search.jpa.impl.fulltextqueryimpl.getresultlist(fulltextqueryimpl.java:137) @ com.paysett.ejb.core.facade.searchfacade.dosearch(searchfacade.java:130) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:616) @ org.glassfish.ejb.security.application.ejbsecuritymanager.runmethod(ejbsecuritymanager.java:1056) @ org.glassfish.ejb.security.application.ejbsecuritymanager.invoke(ejbsecuritymanager.java:1128) @ com.sun.ejb.containers.basecontainer.invokebeanmethod(basecontainer.java:5292) @ com.sun.ejb.ejbinvocation.invokebeanmethod(ejbinvocation.java:615) @ com.sun.ejb.containers.interceptors.aroundinvokechainimpl.invokenext(interceptormanager.java:797) @ com.sun.ejb.ejbinvocation.proceed(ejbinvocation.java:567) @ com.sun.ejb.containers.interceptors.systeminterceptorproxy.doaround(systeminterceptorproxy.java:157) @ com.sun.ejb.containers.interceptors.systeminterceptorproxy.aroundinvoke(systeminterceptorproxy.java:139) @ sun.reflect.generatedmethodaccessor525.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:616) @ com.sun.ejb.containers.interceptors.aroundinvokeinterceptor.intercept(interceptormanager.java:858) @ com.sun.ejb.containers.interceptors.aroundinvokechainimpl.invokenext(interceptormanager.java:797) @ com.sun.ejb.containers.interceptors.interceptormanager.intercept(interceptormanager.java:367) @ com.sun.ejb.containers.basecontainer.__intercept(basecontainer.java:5264) @ com.sun.ejb.containers.basecontainer.intercept(basecontainer.java:5252) @ com.sun.ejb.containers.ejblocalobjectinvocationhandler.invoke(ejblocalobjectinvocationhandler.java:190) ... 52 more
i have read throughly many hibernate search forums , hibernate search in action book without positive results, ca light me ideas or possible solutions problem? thanks
edit: found out problem entrydetail , entrydetailctx both can have same id's (because both on different tables..) since @documentid
inherited abstractrecord can duplicated in both tables @ search execution time generates problem... have additional problem , following:
@entity @inheritance(strategy = inheritancetype.table_per_class) public abstract class abstractrecord implements serializable { //~ instance variables --------------------------------------------------------------- /** serialid */ public static final string serialid = "hyzmfgswl5hsdbxziitnilmt2/eipyjerjcqimun3/pvy3sbbiqie4k9llnl450bhwl8enumyc+wrhgztubtdg9/yuuj+ni/fradrgzty7urqi7opbryryehduwj3hg9"; /** id record. */ @id @generatedvalue(strategy = generationtype.table) @column(name = "id", nullable = false) private integer id; /** line number record. */ @field(index=index.un_tokenized, store=store.no) @column(name = "record_number", nullable = false) private integer recordnumber; /** record types record. */ @field(index=index.un_tokenized, store=store.no) @column(name = "record_type", nullable = false) private integer recordtype; /** current status record. */ @field(index=index.un_tokenized, store=store.no) @column(name = "record_status", nullable = false) @enumerated(enumtype.ordinal) private recordstatus recordstatus; /** unique table key file. */ @field(index=index.un_tokenized, store=store.no) @column(name = "unique_table_key", nullable = false) private string uniquetablekey; ... }
i need uniquetablekey , recordnumber new @documentid's search, hibernate search allows 1 documentid, help?
possible solutions problem following: embeededid , idclass
and annotating @documentid of above chosen solutions
Comments
Post a Comment