diff --git a/samples/computer-database/app/models/AutoDDL.scala b/samples/computer-database/app/models/AutoDDL.scala index 85869bb9..d12b9750 100644 --- a/samples/computer-database/app/models/AutoDDL.scala +++ b/samples/computer-database/app/models/AutoDDL.scala @@ -2,6 +2,6 @@ package play.api.db.slick object AutoDDL extends AutoDDLInterface{ import models._ def tables = Map( - "default" -> Seq(Companies,Computers) + "default" -> Seq(new Companies,new Computers) ) } \ No newline at end of file diff --git a/samples/computer-database/app/models/Models.scala b/samples/computer-database/app/models/Models.scala index 5ee51819..b45f158f 100644 --- a/samples/computer-database/app/models/Models.scala +++ b/samples/computer-database/app/models/Models.scala @@ -17,7 +17,7 @@ case class Company(id: Option[Long], name: String) case class Computer(id: Option[Long] = None, name: String, introduced: Option[Date]= None, discontinued: Option[Date]= None, companyId: Option[Long]=None) -object Companies extends Table[Company]("COMPANY") { +class Companies extends Table[Company]("COMPANY") { def id = column[Long]("id", O.PrimaryKey, O.AutoInc) def name = column[String]("name", O.NotNull) @@ -47,7 +47,7 @@ object Companies extends Table[Company]("COMPANY") { } } -object Computers extends Table[Computer]("COMPUTER") { +class Computers extends Table[Computer]("COMPUTER") { implicit val javaUtilDateTypeMapper = MappedTypeMapper.base[java.util.Date, java.sql.Date]( x => new java.sql.Date(x.getTime), diff --git a/samples/computer-database/app/models/package.scala b/samples/computer-database/app/models/package.scala new file mode 100644 index 00000000..26be4d9c --- /dev/null +++ b/samples/computer-database/app/models/package.scala @@ -0,0 +1,4 @@ +package object models{ + val Companies = new Companies + val Computers = new Computers +} diff --git a/samples/play-slick-sample/app/models/AutoDDL.scala b/samples/play-slick-sample/app/models/AutoDDL.scala index e5d33152..aad9ce97 100644 --- a/samples/play-slick-sample/app/models/AutoDDL.scala +++ b/samples/play-slick-sample/app/models/AutoDDL.scala @@ -2,6 +2,6 @@ package play.api.db.slick object AutoDDL extends AutoDDLInterface{ import models._ def tables = Map( - "default" -> Seq(Cats) + "default" -> Seq(new Cats) ) } \ No newline at end of file diff --git a/samples/play-slick-sample/app/models/Cat.scala b/samples/play-slick-sample/app/models/Cat.scala index d834fc8d..677c8937 100644 --- a/samples/play-slick-sample/app/models/Cat.scala +++ b/samples/play-slick-sample/app/models/Cat.scala @@ -4,7 +4,7 @@ import play.api.db.slick.Config.driver._ case class Cat(name: String, color: String) -object Cats extends Table[Cat]("CAT") { +class Cats extends Table[Cat]("CAT") { def name = column[String]("name", O.PrimaryKey) def color = column[String]("color", O.NotNull) diff --git a/samples/play-slick-sample/app/models/package.scala b/samples/play-slick-sample/app/models/package.scala new file mode 100644 index 00000000..9edca3cd --- /dev/null +++ b/samples/play-slick-sample/app/models/package.scala @@ -0,0 +1,4 @@ +package object models{ + // Slick table objects should not be static singleton objects, because of a Scala bug. Use vals instead. + val Cats = new Cats +} diff --git a/src/main/scala/play/api/db/slick/SlickPlugin.scala b/src/main/scala/play/api/db/slick/SlickPlugin.scala index 862d3bc3..8385565c 100644 --- a/src/main/scala/play/api/db/slick/SlickPlugin.scala +++ b/src/main/scala/play/api/db/slick/SlickPlugin.scala @@ -19,7 +19,7 @@ trait AutoDDLInterface{ class SlickDDLPlugin(app: Application) extends Plugin { private val CreatedBy = "# --- Created by Slick DDL" private val configKey = "slick.autoddl_dbs" - def confError(msg:String) = app.configuration.reportError(configKey, msg) + def confError(msg:String,e:Option[Throwable]=None) = app.configuration.reportError(configKey, msg, e) override def onStart(): Unit = { app.configuration @@ -76,14 +76,28 @@ class SlickDDLPlugin(app: Application) extends Plugin { /** generates DDL for given datasource */ def evolutionScript(db:String): Option[String] = { - val ddls = - fetchAutoDDLobject - .tables - .get(db) - .map(_.map(_.ddl)) - .getOrElse{ - throw confError(s"play.api.db.slick.AutoDDL.tables did not contain datasource '$db'") - } + val tables = + try{ + fetchAutoDDLobject.tables + } catch { + case e:java.lang.LinkageError => + throw confError( + s"LinkageError when trying to load play.api.db.slick.AutoDDL.tables via reflection: '$e'." + +" In the definition of play.api.db.slick.AutoDDL.tables you probably referred to a val," + +" which was not yet initialized. Please refer to defs, singleton objects or alternatively" + +" instantiate the table objects right in the definiton, e.g. like "+""" + def tables = Map( + "default" -> Seq(new MyTableA,new MyTableB) + )""" + , Some(e) + ) + } + val ddls = tables + .get(db) + .map(_.map(_.ddl)) + .getOrElse{ + throw confError(s"play.api.db.slick.AutoDDL.tables did not contain datasource '$db'") + } val delimiter = ";" //TODO: figure this out by asking the db or have a configuration setting?