2011-09-10 2 views
0

자동 증가하는 id 열이있는 테이블과 getter가 @GeneratedValue(strategy = GenerationType.AUTO)으로 주석 된 Java 개체가 있습니다. 이것은 저장할 때 훌륭하게 작동하지만 단위 테스트의 경우 ID를 지정하여 결정적으로 지정하려고합니다. MySQL (우리가 사용하는 DB)에서 insert 문에 값을 지정할 수 있으며 모든 것이 잘 작동합니다. 그러나 Java 객체에서 id 필드를 설정하고 지속 시키려고하면 최대 절전 모드에서 예외가 발생합니다. Hibernate로 하여금 일반적으로 생성 된 값에 대한 값을 지정할 수 있도록 허용하려면 어떻게해야합니까?Java/Hibernate : autoincrement/@GeneratedValue를 사용하여 열의 특정 값을 삽입하는 방법

필드 예 : MySQL은

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
public Long getId() { 
    return this.id; 
} 

작품 :

INSERT INTO myTable (id, str) 
VALUES (10,'this works!') 

가 작동하지 않습니다 :

MyObject myObject = new MyObject(); 
myObject.setId(10L); //remove this line and hibernate saves ok 
myObject.setStr("this does not work."); 
daoForMyObject.persist(myObject); //throws org.springframework.dao.DataIntegrityViolationException 

감사를 사전에 나에게 좋은 테스트 주도 개발 될 도와!

답변

1

이 질문이 있기 전에 제안 된 해결책 here가 있습니다. 희망이 도움이됩니다. 이 게시물은 this stackoverflow questions에서 링크되었습니다.

4

아마도 원하지 않는 방식으로 답장을 드려서 유감이지만 생각은 나쁘다고 생각합니다. 테스트 중심의 개발자가되는 것이 목표라면이 작업을 수행하지 마십시오. 당신은 기본적으로 당신이 테스트하고 싶은 것을 방해하고 있습니다. 검사를받을 때 귀하의 유닛으로부터 특별한 보호를 요청하십시오. 그러나 단위 테스트는 그 단위를 그대로 테스트해야합니다.

hibernate가 autoincrement (또는 그와 같은) 필드에 고정 값을 설정하게하는 경우, 이것은 최대 절전 모드의 버그로 간주 될 수있다. 내가 본대로, 그것은 최대 절전 모드가 그것을 허용하지 않는 것이 좋다.

session.save() 메서드 호출 후에 id 값을 읽지 않는 이유는 무엇입니까? 아마 당신의 daoForMyObject.persist() 전화 사용자가 ID를 읽을 수 save(), 그래서 직후 :

MyObject myObject = new MyObject(); 
myObject.setStr("this does work."); 
daoForMyObject.persist(myObject); 
Long id = myObject.getId(); 

이제 대신 10의 엔터티를 참조하는 id를 사용 ... 왜 이런 식으로 할 수 있어야하지 않겠습니까?

+0

실제로 이것은 내가 게시 한 후에 테스트에서 시작하는 방법입니다 .-P 그러나 자동 증가 필드의 값을 명시 적으로 설정하는 방법은 여전히 ​​궁금합니다. MySQL은 당신이 할 수있게 해준다. 만약 hibernate가 MySQL과 동일한 동작을한다면 좋을 것이다 - 제공되지 않으면 자동 값을 사용한다. 그렇지 않으면 제공된 값을 사용한다. 그것이 버그라고 생각하지 마십시오. – Zugwalt