2013-10-19 3 views
2

springJunit4runner를 사용하여 spring + hibernate + JUnit을 실행 중이고 트랜잭션을 기본 롤백으로 설정했습니다. 데이터베이스에서 메모리 내 derbydb를 사용하고 있습니다. Hibernate는 JPA Provider로 사용되며, CRUD 종류의 것들을 성공적으로 테스트하고 있습니다. 그러나 JPA와 @GeneratedValue의 동작에 문제가 있습니다.테스트간에 JPA 생성 값을 재설정합니다.

내 테스트를 하나씩 실행하면 두 엔티티가 id 1과 2로 유지됩니다. 전체 테스트 스위트를 실행하면 ID 대신 6 그리고 7. Spring은 롤백을 잘 수행하므로 추가 후에 데이터베이스에이 두 엔티티 만 있고 전에는 0이됩니다. 그러나 내가 테스트를 위해 그 일을 기분하지 않는

dao.add(Entity e) //method 

에서 아이디를 반환하지 않는 @GeneratedValue의 행동은 믿을 수 findById 메소드에 저를 허용하지 않거나 반환하는 것이 좋습니다 어쨌든 그렇게해야만하는 엔티티?

답변

0

한 가지 방법이 있습니다. 수동으로 테이블을 변경하여 auto_increment 값을 다시 시작하거나 재설정하십시오. 내가 더비 DB를 사용할 때 그것은 내가 언급 사용 JPA의 API로

em.createNativeQuery("ALTER TABLE konsult ALTER COLUMN id RESTART WITH 1").executeUpdate(); 

그것은 꽤 자명 이후 네이티브 쿼리 통화로 발행 한 다음 SQL 쿼리를 수행하지만, 기본적으로는 테이블 이름과 자동 증가 열을 제공한다 그 테이블의 첫 번째 지속 행이 주어져야하는 값을 선택하십시오. Resetting auto-increment value of MySql database with JPA

난 아직도 다른 제안에 개방적이야하지만이 해킹의 일종이며 방법으로 다른 시험에 대한 종속성 때문에 : 여기

는 mysql을 함께 할 수있는 방법입니다. 또한 RDBMS와 독립적입니다.

1

테스트가 실제로 생성되는 특정 ID 값에 의존해서는 안됩니다. ID 할당은 데이터베이스 & 지속성 계층의 호출 &에 대한 가정을 가정 할 책임이 없습니다.

dao.add(Entity e) 엔티티에서 ID/기본 키 속성을 설정하지 않았습니까? 일반적으로 Hibernate는 엔티티를 저장하기 전에 적어도 & 시퀀스 할당 ID를 생성하기 위해 ID를 설정한다.

은 (그런데, 나는 강하게) 테이블 기반 (휴대용 할당 및 사용을 권장 데이터베이스 별 할당 메커니즘에 따라 결코 -. 시퀀스 또는 자동 증가 컬럼 휴대용 할당 자 독점 키 할당에 따라 빠른 & 작업 매우 매우 어려워 지금까지 다른 데이터베이스에서 실행되도록 할 것입니다.) 일반적으로

,이 저장되어있는 어떤 ID를 알 수있는 수단이 필요을 데이터를 저장 시스템을 .. 그렇지 않으면이 것없이 신뢰할 수있는 &에 고유 한 검색 방법, 이는 우리가 PK를 처음부터 가진 모든 이유입니다!

이 시점에서 올바르게 수행하는 방법을 찾을 수도 있습니다.

+1

ID 생성을 테이블 기반으로 변환했습니다. 그러나 테스트가 하드 코딩 된 예상 ID에 의존하는 이유는 엔티티를 통해 ID를 확보 할 수 없었기 때문입니다. 특정 상황에서 추가 엔티티 e 메소드에서 제공된 엔티티의 복사본이 만들어지고 해당 복사본에 대한 지속 작업이 수행되었으므로 ID는 원래 개체에서 업데이트되지 않았습니다. 정말 바보 같은 구조 였어. 그래서 나는 그것을 바꿨다. – Rythmic

+0

그게 좋은데 ..미래의 앱 개발을위한 훨씬 더 탄탄한 토대가 될 것이며, 그 견고성을 확보하게되면 장기적인 삶을 훨씬 쉽게 만들어줍니다. –

관련 문제