According to http://stackoverflow.com/a/24042737/497381 you can enable larger limit for unique key prefix: innodb_large_prefix=on
Check also http://dba.stackexchange.com/questions/49913/specified-key-was-too-long-max-key-length-is-1000-bytes-in-mysql-5-6 Martin Grigorov Freelancer, available for hire! Wicket Training and Consulting https://twitter.com/mtgrigorov On Tue, Apr 14, 2015 at 11:40 PM, Dan Haywood <[email protected]> wrote: > 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 > > > > > > > > > > > > > > > > > >
