2011-09-15 5 views
0

응답 및 양식의 HTML 템플리트를 저장할 두 개의 테이블이 있습니다. 테이블 응답에는 html_templates 테이블의 기본 키를 참조하는 외래 키가 있습니다. 응답 테이블에 레코드를 추가하려고하면 문제가 발생합니다.레코드가 저장되지 않았지만 데이터베이스의 자동 증가 ID가 증가되었습니다.

//session opened 
    Answers answers = new Answers(); 
    answers.setAnswer("answer..."); 
    //there is a record in getHtmlTemplates with 4 as an id 
    answers.setHtmlTemplates(getHtmlTemplates(4)); 
    session.save(answers); 

프로그램은 warrings없이 실행되지만 DB (MySql)에는 레코드가 없습니다. answers에 레코드를 수동으로 추가 할 때 id가 두 개 이상 증가합니다. 실제로 모든 작업이 트랜잭션 내에있을 때 레코드가 추가됩니다. 어떻게 된 거예요? DB 데이터베이스가이 레코드를 삭제 한 것 같습니다.

답변

3

트랜잭션을 커밋하지 않았을 가능성이 있습니다. MySQL이 사용하는 자동 증가 컬럼의 경우, save 메쏘드는 Hibernate가 새로운 ID 값을 검색 할 수 있도록 더미 레코드를 삽입하게한다. (save이 새로운 ID 인 객체를 리턴한다.) MySQL은 이제이 값을 사용중인 것으로 표시 했으므로 수동으로 삽입 할 때 ID가 "뛰었"는 것처럼 보입니다.

+0

아마도 맞을 것입니다. 하지만 나는 어떤 거래도 시작하지 않은 상황을 생각하고 있었다. 세션을 열었을 때만 세션에 새 객체를 저장 한 다음 session.flush()를 호출했습니다. 일하지 않았어. 내가 모든 트랜잭션을 사용할 때 말했듯이, 트랜잭션을 시작해야합니까? 이 방법은 외래 키가없는 테이블에서 작동하기 때문에 SQL 쿼리를 두 번 이상 실행할 때 (데이터베이스의 개체에서 기본 키를 검색 할 때) 트랜잭션을 시작하고 커밋해야합니다. – Damian

+0

Hibernate는 트랜잭션에서 모든 것을 처리한다. 위의 예에서 트랜잭션은 암시 적으로 시작되지만 절대 커밋하지 않으므로 데이터가 없습니다. – Mac