2011-11-15 2 views
1

저는 Squeryl을 사용하여 하나의 데이터베이스에서 테이블의 내용을 가져 와서 다른 데이터베이스의 해당 테이블에 추가하려고합니다. 기본 키는 프로세스에서 다시 할당해야하지만 오류 은 "SIMID"열에 대해 허용되지 않습니다. 왜 이런거야?Squeryl과 데이터베이스 연결

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) 
    )) 
    } 
} 

업데이트 : 나는 DB를 함께 할 수있는 뭔가있을 것 같아요. 그것들은 JPA/EclipseLink를 사용하여 Java 프로젝트에서 생성되었으며 내 엔티티 용 테이블을 생성하는 데 추가적으로 기본 키 생성을위한 SEQUENCE 테이블이 생성되었습니다.

나는 Squeryl에 새로운 테이블을 만들고 수동으로 두 데이터베이스의 내용을 넣어 동일한 효과를 얻을 수 있음을 알았습니다. 흥미롭게도이 새로운 테이블에는 자동으로 생성 된 SEQUENCE 테이블이 없습니다. 그래서 JPA/EclipseLink가 기본 키를 생성하는 방법에 대한 추측입니다.

업데이트 2 : 요청으로 , 나는 URL에 trace_level_file = 3을 추가하고 파일 위치 : resultsA.trace.dbresultsB.trace.db을. B가 더 재미 있다고 생각합니다. 또한 불필요한 테이블을 제거한 데이터베이스 here의 단순화 된 버전을 배치했습니다 (resultsA 및 resultsB에 대해 동일한 데이터베이스가 사용됨).

+0

어떤 버전의 Squeryl을 사용하고 있습니까? 재현 할 수있는 테스트 케이스를 github에 게시하여 살펴볼 수 있습니까? –

+0

나는 며칠 동안 일하고 있지 않으므로 빈 테스트 DB를 즉시 게시 할 수는 없지만 위의 업데이트를 추가하여 단서를 제공 할 수 있기를 바랍니다. Thanks – Pengin

+0

'; trace_level_file = 3'을 데이터베이스 URL에 추가 한 다음'.trace.db' 파일을 확인하거나 업로드 할 수 있습니까? 문제를 일으키는 모든 JDBC 메소드 호출을 포함해야합니다. –

답변

1

이 점을 좀 더 자세히 살펴 보겠습니다. 나는 네가 올바른 길로 가고 있다는 것을 알았다. 값이 열에 배치 적이있는 AUTO_INCREMENT 플래그없이

simid의 BIGINT not null 기본 키 AUTO_INCREMENT

: 나는 EclipseLink가이 PK 값을 생성하기 위해 시퀀스를 사용하는 추측하지만, Squeryl 같은 무언가로 열을 정의 그리고 당신이 언급 한 제약 조건 위반으로 끝납니다. 이미 문제를 해결 한 것처럼 들리지만, 앞으로이 문제가 도움이 될 것입니다.

+0

확인해 주셔서 감사합니다. – Pengin

0
정말

아니 솔루션,하지만 내 해결 방법은 0 가져 그것을

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

차 키에 새 데이터베이스를 다른 데이터베이스에서

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

후 바로 쓰기 모든 데이터를 생성하는 것입니다 적절하게 덮어 씁니다.