java - Hibernate JPA ManyToOne foreign key mapping with composite key via IdClass does not find columns -


i trying resolve issue database mapping in our application using hibernate. annotate classes using jpa , far successful. however, want introduce composite key unique string identifying customer string identifying database entry. set compound key, use idclass called mandtid.java.

however, seems our mapping not work can not find column join on other side.

here snippets of code show our annotations:

mandtid.java

@suppresswarnings("serial") @embeddable public class mandtid implements serializable { private string mandt;  private string id;  public mandtid() { }  public mandtid(string mandt, string id) {     this.mandt = mandt;     this.id    = id; }  public string getid() {     return id; }  public string getmandt() {     return mandt; }  public void setid(string x) {     id = x; }  public void setmandt(string x) {     mandt = x; }  /* (non-javadoc)  * @see java.lang.object#hashcode()  */ @override public int hashcode() {     int hashcode = 0;     if (mandt != null) hashcode |= mandt.hashcode();     if (id != null) hashcode |= id.hashcode();     return hashcode; }  /* (non-javadoc)  * @see java.lang.object#equals(java.lang.object)  */ @override public boolean equals(object other) {     if (other == null) return false;     if (other == this) return true;     if (!(other instanceof mandtid))return false;     mandtid othermandtid = (mandtid)other;     return objects.equals(mandt, othermandtid.mandt) && objects.equals(id, othermandtid.id);  }  /* (non-javadoc)  * @see java.lang.object#tostring()  */ @override public string tostring() {     return (mandt != null ? mandt : "[null]") + " / " + (id != null ? id : "[null]"); }  } 

enumvalue.java

@entity @idclass(mandtid.class) public class enumvalue extends readwriterecord {  @id @column(name="mandt", insertable = false, updatable = false) private string mandt;  @id @column(name="enumvalueid", insertable = false, updatable = false) private string id;  @manytoone(fetch=fetchtype.eager, optional=false) @joincolumns( {     @joincolumn(name="mandt", referencedcolumnname="mandt", insertable = false, updatable = false),     @joincolumn(name="enumtypeid", referencedcolumnname="enumtypeid", insertable = false, updatable = false) } ) private enumtype enumtype;  ...more irrelevant code... 

enumtype.java

@entity @idclass(mandtid.class) public class enumtype extends readwriterecord {  @id @column(name="mandt", insertable = false, updatable = false) private string mandt;  @id @column(name="enumtypeid", insertable = false, updatable = false) private string id;  @onetomany(mappedby="enumtype", fetch=fetchtype.eager) @orderby("sortindex") private list<enumvalue> values;  ...more irrelevant code... 

the readwriterecord class not contain id related annotations, additional columns.

readwriterecord.java

@mappedsuperclass public abstract class readwriterecord extends persistentrecord {  @column @convert(converter = localdatetimeconverter.class) private localdatetime modifiedat;  @column private string modifiedby;  @column private boolean deleted;  public boolean getdeleted() {     return deleted; }  public void setdeleted(boolean x) {     deleted = x; }  public localdatetime getmodifiedat() {     return modifiedat; }  public string getmodifiedby() {     return modifiedby; }  public final void touch(usercontext context) {     final localdatetime timestamp = localdatetime.now(zoneid.of("z"));     ontouch(context, timestamp); }  protected void ontouch(usercontext context, localdatetime timestamp) {     modifiedby = context != null ? context.getuserid() : null;     modifiedat = timestamp; } } 

persistendrecord.java

public abstract class persistentrecord {  /**  * indicates when record passed databasesession.store().  * <ul>  * <li> if false, entitiymanager.merge() called.  * <li> if true, entitiymanager.persist() called.  * </ul>  * <p>this field managed databasesession , therefore not public.  *    users must call marknew() after creation of new records.  */ boolean mustinsert = false;  @override public string tostring() {     return string.format("%s(%s - %s)", getclass().getsimplename(), getmandt(), getid()); }  /**  * returns id of record, used tostring() , intended generic logging.  * @return primary key of record, format allowed.  */ public abstract string getid();  /**  * returns mandant of record, used tostring() , intended generic logging.  * @return primary key of record, format allowed.  */ public abstract string getmandt();  /**  * sets id of record.  * @param id primary key of record.  */ public abstract void setid(mandtid id);  /**  * must called after creating new entities entitiymanager.persist() called instead of entitiymanager.merge().  */ protected void marknew() {     mustinsert = true; }  /**  * can called force lazy loading.  */ protected void fetch() { }  } 

when mapping , debugging issue, find exception thrown, contains following message:

unable find column logical name: mandt in org.hibernate.mapping.table(enumtype) , related supertables , secondary tables

since mandt column there in both classes, should found. suggestions on how solve issue? prefer mapping suggestion preferably keep database scheme is.

stacktrace:

 javax.persistence.persistenceexception: [persistenceunit: default] unable    build hibernate sessionfactory @   org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl.persistenceexcep     tion(entitymanagerfactorybuilderimpl.java:1249) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl.access$600(entitymanagerfactorybuilderimpl.java:120) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl$4.perform(entitymanagerfactorybuilderimpl.java:860) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl$4.perform(entitymanagerfactorybuilderimpl.java:850) @ org.hibernate.boot.registry.classloading.internal.classloaderserviceimpl.withtccl(classloaderserviceimpl.java:425) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl.build(entitymanagerfactorybuilderimpl.java:849) @ org.hibernate.jpa.hibernatepersistenceprovider.createentitymanagerfactory(hibernatepersistenceprovider.java:75) @ org.hibernate.ejb.hibernatepersistence.createentitymanagerfactory(hibernatepersistence.java:54) @ javax.persistence.persistence.createentitymanagerfactory(persistence.java:55) @ javax.persistence.persistence.createentitymanagerfactory(persistence.java:39) @ platform.data.databasesession.<init>(databasesession.java:94) @ platform.data.mandtdaoimpl.loadallmandt(mandtdaoimpl.java:16) @ platform.data.mandt.getmandt(mandt.java:18) @ platform.data.mandt.lambda$0(mandt.java:10) @ platform.utils.lazy.value(lazy.java:24) @ platform.data.mandt.deflt(mandt.java:13) @ pm.business.injectedlinkproject.getresourcetypes(injectedlinkproject.java:66) @ pm.business.injectedlinkproject.<init>(injectedlinkproject.java:57) @ pm.business.pmlogic.<clinit>(pmlogic.java:17) @ main.business.mainapplication.<clinit>(mainapplication.java:22) @ main.application.maincontroller.<clinit>(maincontroller.java:25) @ routes$$anonfun$routes$1$$anonfun$applyorelse$158$$anonfun$apply$158.apply(routes_routing.scala:2477) @ routes$$anonfun$routes$1$$anonfun$applyorelse$158$$anonfun$apply$158.apply(routes_routing.scala:2477) @ play.core.router$handlerinvokerfactory$$anon$5.resultcall(router.scala:267) @ play.core.router$handlerinvokerfactory$javaactioninvokerfactory$$anon$15$$anon$1.invocation(router.scala:255) @ play.core.j.javaaction$$anon$1.call(javaaction.scala:55) @ play.core.j.javaaction$$anonfun$11.apply(javaaction.scala:82) @ play.core.j.javaaction$$anonfun$11.apply(javaaction.scala:82) @ scala.concurrent.impl.future$promisecompletingrunnable.liftedtree1$1(future.scala:24) @ scala.concurrent.impl.future$promisecompletingrunnable.run(future.scala:24) @ play.core.j.httpexecutioncontext$$anon$2.run(httpexecutioncontext.scala:40) @ play.api.libs.iteratee.execution$trampoline$.execute(execution.scala:46) @ play.core.j.httpexecutioncontext.execute(httpexecutioncontext.scala:32) @ scala.concurrent.impl.future$.apply(future.scala:31) @ scala.concurrent.future$.apply(future.scala:492) @ play.core.j.javaaction$class.apply(javaaction.scala:82) @ play.core.router$handlerinvokerfactory$javaactioninvokerfactory$$anon$15$$anon$1.apply(router.scala:252) @ play.api.mvc.action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(action.scala:130) @ play.api.mvc.action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(action.scala:130) @ play.utils.threads$.withcontextclassloader(threads.scala:21) @ play.api.mvc.action$$anonfun$apply$1$$anonfun$apply$4.apply(action.scala:129) @ play.api.mvc.action$$anonfun$apply$1$$anonfun$apply$4.apply(action.scala:128) @ scala.option.map(option.scala:146) @ play.api.mvc.action$$anonfun$apply$1.apply(action.scala:128) @ play.api.mvc.action$$anonfun$apply$1.apply(action.scala:121) @ play.api.libs.iteratee.iteratee$$anonfun$mapm$1.apply(iteratee.scala:483) @ play.api.libs.iteratee.iteratee$$anonfun$mapm$1.apply(iteratee.scala:483) @ play.api.libs.iteratee.iteratee$$anonfun$flatmapm$1.apply(iteratee.scala:519) @ play.api.libs.iteratee.iteratee$$anonfun$flatmapm$1.apply(iteratee.scala:519) @ play.api.libs.iteratee.iteratee$$anonfun$flatmap$1$$anonfun$apply$14.apply(iteratee.scala:496) @ play.api.libs.iteratee.iteratee$$anonfun$flatmap$1$$anonfun$apply$14.apply(iteratee.scala:496) @ scala.concurrent.impl.future$promisecompletingrunnable.liftedtree1$1(future.scala:24) @ scala.concurrent.impl.future$promisecompletingrunnable.run(future.scala:24) @ akka.dispatch.taskinvocation.run(abstractdispatcher.scala:41) @ akka.dispatch.forkjoinexecutorconfigurator$akkaforkjointask.exec(abstractdispatcher.scala:393) @ scala.concurrent.forkjoin.forkjointask.doexec(forkjointask.java:260) @ scala.concurrent.forkjoin.forkjoinpool$workqueue.runtask(forkjoinpool.java:1339) @ scala.concurrent.forkjoin.forkjoinpool.runworker(forkjoinpool.java:1979) @ scala.concurrent.forkjoin.forkjoinworkerthread.run(forkjoinworkerthread.java:107)  caused by: org.hibernate.mappingexception: unable find column logical name: mandt in org.hibernate.mapping.table(enumtype) , related supertables , secondary tables @ org.hibernate.cfg.ejb3joincolumn.checkreferencedcolumnstype(ejb3joincolumn.java:582) @ org.hibernate.cfg.binderhelper.createsyntheticpropertyreference(binderhelper.java:258) @ org.hibernate.cfg.toonefksecondpass.dosecondpass(toonefksecondpass.java:116) @ org.hibernate.cfg.configuration.processendofqueue(configuration.java:1598) @ org.hibernate.cfg.configuration.processfksecondpassinorder(configuration.java:1521) @ org.hibernate.cfg.configuration.secondpasscompile(configuration.java:1422) @ org.hibernate.cfg.configuration.buildsessionfactory(configuration.java:1846) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl$4.perform(entitymanagerfactorybuilderimpl.java:857) ... 56 more   org.hibernate.mappingexception: unable find column logical name: mandt in org.hibernate.mapping.table(enumtype) , related supertables , secondary tables @ org.hibernate.cfg.ejb3joincolumn.checkreferencedcolumnstype(ejb3joincolumn.java:582) @ org.hibernate.cfg.binderhelper.createsyntheticpropertyreference(binderhelper.java:258) @ org.hibernate.cfg.toonefksecondpass.dosecondpass(toonefksecondpass.java:116) @ org.hibernate.cfg.configuration.processendofqueue(configuration.java:1598) @ org.hibernate.cfg.configuration.processfksecondpassinorder(configuration.java:1521) @ org.hibernate.cfg.configuration.secondpasscompile(configuration.java:1422) @ org.hibernate.cfg.configuration.buildsessionfactory(configuration.java:1846) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl$4.perform(entitymanagerfactorybuilderimpl.java:857) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl$4.perform(entitymanagerfactorybuilderimpl.java:850) @ org.hibernate.boot.registry.classloading.internal.classloaderserviceimpl.withtccl(classloaderserviceimpl.java:425) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl.build(entitymanagerfactorybuilderimpl.java:849) @ org.hibernate.jpa.hibernatepersistenceprovider.createentitymanagerfactory(hibernatepersistenceprovider.java:75) @ org.hibernate.ejb.hibernatepersistence.createentitymanagerfactory(hibernatepersistence.java:54) @ javax.persistence.persistence.createentitymanagerfactory(persistence.java:55) @ javax.persistence.persistence.createentitymanagerfactory(persistence.java:39) @ platform.data.databasesession.<init>(databasesession.java:94) @ platform.data.mandtdaoimpl.loadallmandt(mandtdaoimpl.java:16) @ platform.data.mandt.getmandt(mandt.java:18) @ platform.data.mandt.lambda$0(mandt.java:10) @ platform.utils.lazy.value(lazy.java:24) @ platform.data.mandt.deflt(mandt.java:13) @ pm.business.injectedlinkproject.getresourcetypes(injectedlinkproject.java:66) @ pm.business.injectedlinkproject.<init>(injectedlinkproject.java:57) @ pm.business.pmlogic.<clinit>(pmlogic.java:17) @ main.business.mainapplication.<clinit>(mainapplication.java:22) @ main.application.maincontroller.<clinit>(maincontroller.java:25) @ routes$$anonfun$routes$1$$anonfun$applyorelse$158$$anonfun$apply$158.apply(routes_routing.scala:2477) @ routes$$anonfun$routes$1$$anonfun$applyorelse$158$$anonfun$apply$158.apply(routes_routing.scala:2477) @ play.core.router$handlerinvokerfactory$$anon$5.resultcall(router.scala:267) @ play.core.router$handlerinvokerfactory$javaactioninvokerfactory$$anon$15$$anon$1.invocation(router.scala:255) @ play.core.j.javaaction$$anon$1.call(javaaction.scala:55) @ play.core.j.javaaction$$anonfun$11.apply(javaaction.scala:82) @ play.core.j.javaaction$$anonfun$11.apply(javaaction.scala:82) @ scala.concurrent.impl.future$promisecompletingrunnable.liftedtree1$1(future.scala:24) @ scala.concurrent.impl.future$promisecompletingrunnable.run(future.scala:24) @ play.core.j.httpexecutioncontext$$anon$2.run(httpexecutioncontext.scala:40) @ play.api.libs.iteratee.execution$trampoline$.execute(execution.scala:46) @ play.core.j.httpexecutioncontext.execute(httpexecutioncontext.scala:32) @ scala.concurrent.impl.future$.apply(future.scala:31) @ scala.concurrent.future$.apply(future.scala:492) @ play.core.j.javaaction$class.apply(javaaction.scala:82) @ play.core.router$handlerinvokerfactory$javaactioninvokerfactory$$anon$15$$anon$1.apply(router.scala:252) @ play.api.mvc.action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(action.scala:130) @ play.api.mvc.action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(action.scala:130) @ play.utils.threads$.withcontextclassloader(threads.scala:21) @ play.api.mvc.action$$anonfun$apply$1$$anonfun$apply$4.apply(action.scala:129) @ play.api.mvc.action$$anonfun$apply$1$$anonfun$apply$4.apply(action.scala:128) @ scala.option.map(option.scala:146) @ play.api.mvc.action$$anonfun$apply$1.apply(action.scala:128) @ play.api.mvc.action$$anonfun$apply$1.apply(action.scala:121) @ play.api.libs.iteratee.iteratee$$anonfun$mapm$1.apply(iteratee.scala:483) @ play.api.libs.iteratee.iteratee$$anonfun$mapm$1.apply(iteratee.scala:483) @ play.api.libs.iteratee.iteratee$$anonfun$flatmapm$1.apply(iteratee.scala:519) @ play.api.libs.iteratee.iteratee$$anonfun$flatmapm$1.apply(iteratee.scala:519) @ play.api.libs.iteratee.iteratee$$anonfun$flatmap$1$$anonfun$apply$14.apply(iteratee.scala:496) @ play.api.libs.iteratee.iteratee$$anonfun$flatmap$1$$anonfun$apply$14.apply(iteratee.scala:496) @ scala.concurrent.impl.future$promisecompletingrunnable.liftedtree1$1(future.scala:24) @ scala.concurrent.impl.future$promisecompletingrunnable.run(future.scala:24) @ akka.dispatch.taskinvocation.run(abstractdispatcher.scala:41) @ akka.dispatch.forkjoinexecutorconfigurator$akkaforkjointask.exec(abstractdispatcher.scala:393) @ scala.concurrent.forkjoin.forkjointask.doexec(forkjointask.java:260) @ scala.concurrent.forkjoin.forkjoinpool$workqueue.runtask(forkjoinpool.java:1339) @ scala.concurrent.forkjoin.forkjoinpool.runworker(forkjoinpool.java:1979) @ scala.concurrent.forkjoin.forkjoinworkerthread.run(forkjoinworkerthread.java:107) 

thanks

i fix issue myself using workaround proposed elsewhere on stackoverflow (https://stackoverflow.com/a/13147366/4563947).

here snippets of code show our annotations work:

mandtid.java

@suppresswarnings("serial") public class mandtid implements serializable { private string mandt;  private string id;  public mandtid() { }  public mandtid(string mandt, string id) {     this.mandt = mandt;     this.id    = id; }  public string getid() {     return id; }  public string getmandt() {     return mandt; }  public void setid(string x) {     id = x; }  public void setmandt(string x) {     mandt = x; }  /* (non-javadoc)  * @see java.lang.object#hashcode()  */ @override public int hashcode() {     int hashcode = 0;     if (mandt != null) hashcode |= mandt.hashcode();     if (id != null) hashcode |= id.hashcode();     return hashcode; }  /* (non-javadoc)  * @see java.lang.object#equals(java.lang.object)  */ @override public boolean equals(object other) {     if (other == null) return false;     if (other == this) return true;     if (!(other instanceof mandtid))return false;     mandtid othermandtid = (mandtid)other;     return objects.equals(mandt, othermandtid.mandt) && objects.equals(id, othermandtid.id);  }  /* (non-javadoc)  * @see java.lang.object#tostring()  */ @override public string tostring() {     return (mandt != null ? mandt : "[null]") + " / " + (id != null ? id : "[null]"); }  } 

enumvalue.java

@entity @idclass(mandtid.class) public class enumvalue extends readwriterecord {  @id @column(name="mandt") private string mandt;  @id @column(name="enumvalueid") private string id;  @manytoone(fetch=fetchtype.eager, optional=false)     @joincolumnsorformulas( {         @joincolumnorformula(column= @joincolumn(name="mandt", referencedcolumnname="mandt", insertable=false, updatable=false)),         @joincolumnorformula(column= @joincolumn(name="enumtypeid", referencedcolumnname="enumtypeid", insertable=false, updatable=false)) } ) private enumtype enumtype;  ...more irrelevant code... 

enumtype.java

@entity @idclass(mandtid.class) public class enumtype extends readwriterecord {  @id @column(name="mandt") private string mandt;  @id @column(name="enumtypeid") private string id;  @onetomany(mappedby="enumtype", fetch=fetchtype.eager) @orderby("sortindex") private list<enumvalue> values;  ...more irrelevant code... 

the joincolumnorformula annotations fix issues not found logical names, mixing updatable , non-updatable constraints etc. important though annotate columnorformula, never specify formula @ all. formulas caused issues formula column conversion.


Comments

Popular posts from this blog

sequelize.js - Sequelize group by with association includes id -

android - Robolectric "INTERNET permission is required" -

java - Android raising EPERM (Operation not permitted) when attempting to send UDP packet after network connection -