我正在尝试使用 Squeryl 从一个数据库中获取表的内容,并将其附加到另一个数据库中的等效表中。在此过程中必须重新分配主键,但我收到错误NULL not allowed for column "SIMID"。为什么是这样?
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)
))
}
}
更新: 我认为这可能与数据库有关。它们是在使用 JPA/EclipseLink 的 Java 项目中创建的,除了为我的实体生成表之外,它还创建了一个名为 SEQUENCE 的表,大概是用于生成主键。
我发现我可以在 Squeryl 中创建一个全新的表并手动将两个数据库的内容放入其中,从而达到相同的效果。有趣的是,这个新表没有自动生成任何 SEQUENCE 表。所以我猜它归结为 JPA/EclipseLink 是如何生成我的主键的?
更新 2: 根据要求,我将 trace_level_file=3 附加到 url 并且文件在这里:resultsA.trace.db和resultsB.trace.db。B是我认为更有趣的一个。此外,我在这里放置了一个简化版本的数据库,其中删除了不必要的表(相同的数据库用于 resultsA 和 resultsB)。