Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 用Squeryl连接数据库_Scala_H2_Squeryl - Fatal编程技术网

Scala 用Squeryl连接数据库

Scala 用Squeryl连接数据库,scala,h2,squeryl,Scala,H2,Squeryl,我试图使用Squeryl从一个数据库中获取一个表的内容,并将其附加到另一个数据库中的等效表中。在这个过程中必须重新分配主键,但是对于列“SIMID”,我得到了一个错误NULL,这是不允许的。为什么会这样 object Concatenator { def main(args: Array[String]) { Class.forName("org.h2.Driver"); val seshA = Session.create( java.sql.DriverMa

我试图使用Squeryl从一个数据库中获取一个表的内容,并将其附加到另一个数据库中的等效表中。在这个过程中必须重新分配主键,但是对于列“SIMID”,我得到了一个错误NULL,这是不允许的。为什么会这样

object Concatenator {
  def main(args: Array[String]) {
    Class.forName("org.h2.Driver");

    val seshA = Session.create(
      java.sql.DriverManager.getConnection("jdbc:h2:file:data/resultsA", "sa", "password"),
      new H2Adapter
    )

    val seshB = Session.create(
      java.sql.DriverManager.getConnection("jdbc:h2:file:data/resultsB", "sa", "password"),
      new H2Adapter
    )

    using(seshA){
      import Library._
      from(sims){s => select(s)}.foreach{item =>
        using(seshB){
          sims.insert(item);
        }
      }
    }

  }

  case class Simulation(
    @Column("SIMID")
    var id: Long, 
    val date: Date
  ) extends KeyedEntity[Long]

  object Library extends Schema {
    val sims = table[Simulation]

    on(sims)(s => declare(
      s.id is(unique, indexed, autoIncremented)
    ))
  }
}
更新: 我认为这可能与DBs有关。它们是在一个Java项目中使用JPA/EclipseLink创建的,除了为我的实体生成表之外,它还创建了一个名为SEQUENCE的表,可能用于主键生成

我发现我可以在Squeryl中创建一个全新的表,并手动将两个数据库的内容放入其中,从而实现相同的效果。有趣的是,这个新表没有自动生成任何序列表。所以我猜这要归结到JPA/EclipseLink是如何生成我的主键的

更新2:
根据请求,我将trace_level_file=3附加到url,文件如下:和。B是我认为更有趣的一个。此外,我还添加了一个简化版本的数据库,删除了不必要的表(相同的数据库用于resultsA和resultsB)。

这不是一个真正的解决方案,但我的解决方法是创建一个新的数据库

val seshNew = Session.create(java.sql.DriverManager.getConnection("jdbc:h2:file:data/resultsNew", "sa","password"),new H2Adapter)
然后将其他数据库中的所有数据写入其中

using(seshNew){
    sims.insert(new Simulation(0,item.date))
}

将根据需要覆盖主键0

这不是一个真正的解决方案,但我的解决办法是创建一个新的数据库

val seshNew = Session.create(java.sql.DriverManager.getConnection("jdbc:h2:file:data/resultsNew", "sa","password"),new H2Adapter)
然后将其他数据库中的所有数据写入其中

using(seshNew){
    sims.insert(new Simulation(0,item.date))
}

将根据需要覆盖主键0

刚刚有时间更仔细地看一下。我发现你在正确的轨道上。我猜EclipseLink使用序列生成PK值,而Squiryl将列定义为:

simid bigint not null主键自动增量


如果没有auto_increment标志,值将永远不会放在列中,并且最终会出现您提到的约束冲突。听起来你已经解决了这个问题,但希望这能对你或其他人在未来有所帮助。

刚刚有时间更仔细地研究一下这个问题。我发现你在正确的轨道上。我猜EclipseLink使用序列生成PK值,而Squiryl将列定义为:

simid bigint not null主键自动增量


如果没有auto_increment标志,值将永远不会放在列中,并且最终会出现您提到的约束冲突。听起来您已经解决了这个问题,但希望这对您或其他人将来有所帮助。

您使用的是什么版本的Squiryl?您是否愿意将一个可复制的测试用例发布到github,以便我可以查看?我有几天没有工作,因此无法立即发布空白测试数据库,但添加了一个更新,我希望在上面提供一些线索。感谢您附加
;trace_level_file=3
到数据库URL,然后检查或上载
.trace.db
文件?它应该包含导致问题的所有JDBC方法调用。您使用的是哪个版本的Squeryl?您是否愿意将一个可复制的测试用例发布到github,以便我可以查看?我有几天没有工作,因此无法立即发布空白测试数据库,但添加了一个更新,我希望在上面提供一些线索。感谢您附加
;trace_level_file=3
到数据库URL,然后检查或上载
.trace.db
文件?它应该包含导致问题的所有JDBC方法调用。