2011-09-15 5 views
2

고유성을 검사해야하는 긴 UTF-8 문자열을 MySQL 데이터베이스에 저장해야합니다. 이것은 현재의 구성입니다 :MySQL InnoDB를 사용하여 JPA의 TEXT 열에 대한 고유 한 제약

@Column(unique = true,length = 8000,columnDefinition="TEXT") 
private String text; 

하지만, MySQL이 인덱스 접두사를 필요로하기 때문에 모두 BLOBTEXT 필드에 지정해야합니다,이 다음과 같은 오류와 함께 실패합니다 내가 제대로 구성 할 수있는 방법

BLOB/TEXT column 'path' used in key specification without a key length 

을 내 ORM 매핑은 그러한 유스 케이스를 지원합니까?

+1

MySQL은 특정 길이의 IIRC보다 긴 TEXT 필드를 색인 할 수 없으며 최대 1,000 (맨 왼쪽) 만 색인의 일부로 허용하고 길이의 분리를 지정할 수있는 ORM을 알지 못합니다 전체 열 – DataNucleus

답변

3

calculating a hash value for your text string을 고려해 보셨나요? 그런 다음 해시 값을 저장하고 해시 값의 고유성을 검사 할 수 있습니다. 해시 값으로 얻은 충돌이 있으면 실제 텍스트 문자열을 검사합니다. 서로 다르면 시퀀스 값이 포함됩니다. 그렇지 않으면 오류를 발견했습니다. 그래서 테이블이

해시, 시퀀스 (동일한 해시 값 내에서 고유), TextString

이고 고유 인덱스가

해시, 시퀀스입니다

고유성 계산을 테스트하려면 해시 값과 0 시퀀스로 저장하려고 시도합니다. 시퀀스 0에 저장할 수 없으면 시퀀스 0에서 텍스트 문자열을 비교하십시오. 동일하면 중복 된 텍스트를 찾았습니다. 서로 다른 경우 시퀀스에 저장하려고 시도합니다. 1. 해당 시퀀스 번호에서 중복 된 텍스트 문자열을 찾을 때까지 반복하거나 다음 사용 가능한 시퀀스 번호로 데이터베이스에 저장하는 데 실패하지 않을 때까지 반복합니다.

트릭은 매우 많은 중복을 제공하지 않으며 긴 텍스트 문자열을 처리 할 수있는 해시 알고리즘을 파악하고 있습니다. 심지어 더 좋은 ORM은 당신을 위해 이것을 할 수 있습니다.

+0

궁극적으로, 우리는 더 이상 내 질문에 대한 직접적인 대답을 찾으려고 노력하면서이 길을갔습니다. ORM 요정 가루가 우리에게 도움이 될 것이라는 것을 이해 했으므로 우리 문제에 대한 최종 해결책이되었습니다. 그것을 서면으로 보내 주셔서 감사합니다. – skuro

관련 문제