I suspect that you'll find that the Rule class already has a @PersistenceCapable annotation; otherwise you wouldn't have seen any DDL for the "create table rule".
I was going to say that I thought that the DataNuclues enhancer hasn't correctly run, but I think that usually manifests itself as some other problem. Even so, I do think that, somehow, DN is trying to serialize the Rule instance rather than store the rule's Id as a foreign key. Two questions: - can you post the full source code for the Rule class? - does the app run using hsqldb:mem (rather than MySQL). Thx Dan On 14 April 2015 at 22:15, Martin Grigorov <[email protected]> wrote: > Hi, > > You should annotate Rule class with @PersistenceCapable as SimpleObject > does: > > https://github.com/apache/isis/blob/c3740b13177e4db7d7cafae3c1dd839b997fc806/example/application/simpleapp/dom/src/main/java/domainapp/dom/modules/simple/SimpleObject.java#L38 > > Martin Grigorov > Freelancer, available for hire! > Wicket Training and Consulting > https://twitter.com/mtgrigorov > > On Tue, Apr 14, 2015 at 4:16 PM, Marianne Hagaseth < > [email protected]> wrote: > > > But how do I annotate the Rule class as @PersistenceCapable ? > > > > -----Original Message----- > > From: Dan Haywood [mailto:[email protected]] > > Sent: 20. mars 2015 10:42 > > To: users > > Subject: Re: MySQL and "Specified key was too long" > > > > Hi Marianne, > > > > My *guess* is that the Rule class is not annotated as @PersistenceCapable > > but is serializable, and so DataNucleus is serializing the object as a > > byte[] array, and that is overflowing the limit for MySQL. > > > > Double check what the schema is that's being created; you can get DN to > > log this by setting: > > > > log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console > > > > in WEB-INF/logging.properties . > > > > You could also set: > > > > log4j.logger.DataNucleus.Datastore.Native=DEBUG, Console > > > > in order to inspect the SQL INSERT statement. > > > > Let us know how you get on. > > > > Cheers > > Dan > > > > > > > > > > On 20 March 2015 at 09:35, Marianne Hagaseth < > > [email protected]> wrote: > > > > > Hi there, > > > I am trying to add this property (see code further down) and then > > > using mySQL for the persistence. > > > However, it fails with a MySQL error: "Specified key was too long; max > > > key length is 767 bytes" > > > > > > Anyone who have ideas for where to start searching for the error? > > > > > > Best, > > > Marianne Hagaseth. > > > > > > //region > rule (property) > > > private Rule rule; > > > @javax.jdo.annotations.Column(name="ruleId",allowsNull="true") > > > @MemberOrder(name="General", sequence="80") > > > public Rule getRule() { > > > return rule; > > > } > > > public void setRule(final Rule rule) { > > > this.rule = rule; > > > } > > > //endregion > > > > > > > > > > > > 10:20:45,861 [Schema main DEBUG] Execution Time = > > > 123 ms > > > 10:20:45,865 [Datastore main ERROR] An exception was > > > thrown while adding/validating class(es) : Specified key was too long; > > > max key length is 767 bytes > > > com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified > > > key was too long; max key length is 767 bytes > > > at > > > sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native > > > Method) > > > at > > > > > > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) > > > at > > > > > > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) > > > at > > > java.lang.reflect.Constructor.newInstance(Constructor.java:526) > > > > > > > > > at org.mortbay.jetty.Server.doStart(Server.java:224) > > > at > > > > org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) > > > at > > > > > > org.apache.isis.core.webserver.WebServerBootstrapper.bootstrap(WebServerBootstrapper.java:85) > > > at > > org.apache.isis.core.webserver.WebServer.run(WebServer.java:103) > > > at > > org.apache.isis.core.webserver.WebServer.main(WebServer.java:67) > > > at org.apache.isis.WebServer.main(WebServer.java:25) > > > > > > 10:20:45,865 [Datastore main ERROR] An exception was > > > thrown while adding/validating class(es) : Specified key was too long; > > > max key length is 767 bytes > > > com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified > > > key was too long; max key length is 767 bytes > > > at > > > sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native > > > Method) > > > at > > > > > > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) > > > at > > > > > > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) > > > at > java.lang.reflect.Constructor.newInstance(Constructor.java:526) > > > at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) > > > at com.mysql.jdbc.Util.getInstance(Util.java:360) > > > at > > > com.mysql.jdbc.SQLError.createSQLException(SQLError.java:978) > > > > > > > > > Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: > > > Specified key was too long; max key length is 767 bytes > > > at > > > sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native > > > Method) > > > at > > > > > > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) > > > at > > > > > > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) > > > at > java.lang.reflect.Constructor.newInstance(Constructor.java:526) > > > ... 54 more > > > 10:20:46,204 [WicketFilter main ERROR] The > initialization > > > of an application with name 'WicketFilter' has failed. > > > com.google.inject.ProvisionException: Guice provision errors: > > > > > > 1) Error in custom provider, > > > org.datanucleus.exceptions.NucleusDataStoreException: Error(s) were > > > found while auto-creating/validating the datastore for classes. The > > > errors are printed in the log, and are attached to this exception. > > > at > > > org.apache.isis.core.runtime.runner.IsisInjectModule.provideIsisSystem > > > (IsisInjectModule.java:132) > > > > > > > > > //region > rule (property) > > > private Rule rule; > > > @javax.jdo.annotations.Column(name="ruleId",allowsNull="true") > > > @MemberOrder(name="General", sequence="80") > > > public Rule getRule() { > > > return rule; > > > } > > > public void setRule(final Rule rule) { > > > this.rule = rule; > > > } > > > //endregion > > > > > > > > > > > >
