2009-03-17 2 views
4

오라클은 빈 문자열을 null로 처리합니다.Oracle은 빈 문자열을 null로 변환하지만 JPA는 이에 따라 엔티티 캐시를 업데이트하지 않습니다.

그러나 JPA의 캐싱으로 인해이 문제로 인해 문제가 발생합니다.

먼저 JPA (Toplink Essentials)를 사용하여 하나의 필드로 빈 문자열이있는 엔티티를 사용합니다. Oracle은이 값을 저장할 때이 값을 null로 변환합니다.

그러나 엔티티를 가져올 때 JPA는이 필드가 여전히 빈 문자열 인 캐시에서 해당 엔티티를 반환하는 것처럼 보입니다. JPA는 데이터베이스에 저장된 내용이 실제로는 null 값이라는 사실을 모르는 것처럼 보입니다.이 비 일관성은 문제를 일으 킵니다.

JPA 또는 응용 프로그램 서버 (Oracle AS) 구성 레벨에서이 문제점을 해결할 수있는 방법이 있습니까? 이것은 응용 프로그램 수준에서 수정하고 싶지 않은 (하지만 필요한 경우 수행 할 것임) 내용입니다.

답변

2

@ReturnInsert 및 @ReturnUpdate 주석을 지원하는 EclipseLink로 마이그레이션했습니다. 이들은 실제로 데이터베이스에 저장된 값으로 필드를 새로 고치는 데 도움이됩니다.

-2

나는 오라클이 "unset"값으로 문자열을 저장하는 null 값으로 저장하지 않는다고 생각한다. 따라서 null 값을 선택하려고하면 설정되지 않았고 null이 아니기 때문에 해당 항목을 검색하지 않습니다. 특별히 빈 문자열이 아닌 null을 삽입하려고 했습니까?

나는 한 번 프로젝트를 만들었습니다. 솔루션이 null이 아닌 것으로 처리 되었기 때문에 솔루션이 데이터베이스 - 열에 특별히 저장하고 string.empty가 아닌 비슷한 문제가있는 곳에서 ...

+0

사실 이러한 값은 데이터베이스에 null로 저장됩니다. – tputkonen

+0

오케이 ... 결과가 DBNull인지 확인 했습니까? java가 null과 DBNull을 변경하기 때문에 – Gambrinus

+0

무슨 뜻인지 모르겠지만 먼저 foo (빈 문자열) 필드가있는 엔티티를 유지합니다. 오라클은이를 null로 저장합니다. 그런 다음 foo가 null 값을 포함하는지 테스트하고, 그렇지 않으면 null이 아닌 다른 필드에 저장하려고 시도합니다. 나는 JPA가 id를 저장하는 것과 같은 방식으로 foo를 무효화하고 싶습니다. – tputkonen

관련 문제