2013-05-09 2 views
0

저는 카이엔 (Cayenne)을 사용하여 MySQL 데이터베이스에 레코드를 추가하고 있으며, 이상한 행동을보고 있습니다.Cayenne은 기본 키 값을 "재설정"합니까?

응용 프로그램을 실행할 때 DataContext를 만들고 일련의 추가 작업을 수행 한 다음 응용 프로그램을 닫습니다. 이것은 기본 키에 정수를 사용하고 데이터베이스에 레코드를 추가 할 때 키가 자동으로 증가하므로 잘됩니다. 어떤 이유로, 첫 번째 레코드는 200에서 시작하고 두 번째 레코드는 201로 이동합니다.

그러나 응용 프로그램을 중지했다가 다시 실행하면 기본 키가 다시 200에서 시작됩니다! 이것은 물론 새로운 레코드가 중복 된 기본 키를 갖기 때문에 예외가 발생합니다. 그것은 응용 프로그램을 시작한 후에 DataContext의 newObject()를 사용하여 새 객체를 만들 때처럼 보이지만 Cayenne은 응용 프로그램이 이전에 실행될 때 기본 키가 얼마나 증가되었는지를 "기억"하지 않습니다.

누군가가이 기본 키 값을 재설정하는 원인을 알고 있으며 (더 중요한 것은) 발생을 막는 방법은 무엇입니까 ??? 아니면 현재 버전의 Cayenne에서 버그를 발견 했습니까? 버전 3.0.2를 사용 중입니다. 누군가가 조언을 바랍니다

... 주어진 테이블에 대한

답변

1

마지막으로 사용 된 PK는 AUTO_PK_SUPPORT라는 특수 테이블에 저장됩니다. 앱 재시작 사이에이 표의 내용을 확인하십시오. 또한 응용 프로그램 Cayenne이 AUTO_PK_SUPPORT에 대한 읽기 및 쓰기를 기록하는지 확인하십시오. 이렇게하면 무슨 일이 일어나는지 알 수 있습니다.

이외에도 자동 증분 PK ("데이터베이스에서 제공하는 기본 키"섹션 here 참조)로 전환 할 수 있습니다. MySQL은 자동으로 증가하는 PK 컬럼을 지원하며, 스키마를 변경할 수있는 옵션이있는 경우,이 IMO는 사용 가능한 것 중 가장 깨끗한 PK 생성 전략입니다. (그리고 AUTO_PK_SUPPORT가 필요하지 않습니다.)

+0

예, 이미 AUTO_PK_SUPPORT 테이블을 검사했고 모델러가 생성 한 SQL을 읽었습니다. 분명히, 당신이 스키마를 만들 때, 어떤 이유로 Cayenne Modeler는 "다음"기본 키를 200으로 설정합니다 (왜 내가 모르는 지!). 키 생성을 "데이터베이스"에서 설정 한 경우에도이 작업을 수행하는 것으로 보입니다 (다른 항목을 여기에서 읽는 것으로 알았습니다). Modeler가이 작업을 수행하는 것을 막을 수있는 방법을 찾지 못했습니다. 내가 직접 키 지원 테이블에 손을 대지 않아도 될지도 모른다. 내가 정말로하고 싶지 않은 무엇인가 ... –

+0

나는 실제로 매우 어리 석었다. Modeler를 사용하여 데이터베이스 스키마를 만들 때 "Create PK Support"확인란의 선택을 취소 할 때 도움이됩니다. 문제 해결됨. –

+0

다행스럽게 생각해 냈습니다. BTW "200"시작 값은 초기 카이엔 (Cayenne) 시대의 유산 중 일부입니다. 카이엔 밖에서 사용할 수 있도록 보장 된 작은 ID 블록을 "예약 됨"으로 유지하는 것이 좋습니다. 이것은 완전히 임의적입니다 (10 또는 1000 등이 될 수 있습니다). 아무 것도 영향을주지 않아야합니다. 나는 우리가 혼란을 줄이기 위해 1로 쉬어야 할 것 같아요. –

관련 문제