It looks like this, which looks OK?
[Schema main DEBUG] CREATE TABLE rule
(
id BIGINT NOT NULL AUTO_INCREMENT,
context VARCHAR(3000) BINARY NULL,
disjunctrequirement BIT NULL,
`exception` VARCHAR(3000) BINARY NULL,
mandatory BIT NOT NULL,
ownedby VARCHAR(255) BINARY NULL,
requirement VARCHAR(3000) BINARY NOT NULL,
subject VARCHAR(255) BINARY NULL,
target VARCHAR(3000) BINARY NOT NULL,
`type` VARCHAR(255) BINARY NULL,
version BIGINT NOT NULL,
CONSTRAINT rule_pk PRIMARY KEY (id)
) ENGINE=INNODB
-----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
>
>
>