2011-08-11 5 views
0

ID가 SQL Server db (스키마를 변경할 수없는 타사 db)에 생성 된 GUID 인 ID를 가진 엔티티가 있으므로 필드가 정의됩니다 ; 삽입 된 행을 검색 할 때 삽입이 실패합니다.

@Id 
@GenericGenerator(name="generator", strategy="guid", parameters = {}) 
@GeneratedValue(generator ="generator") 
@Column(name="FarmID") 
public String getId() { 
    return id; 
} 

I 새로운 엔티티를 생성하고 저장

가 상기 ID는 제 올바르게 NEWID를 호출 GUIDGenerator() 의해 생성되고, 그 행의 매개 변수 값으로 상기 생성 된 ID를 이용하여 삽입된다. 그러나 삽입 후 Hibernate는 새로 삽입 된 행을 검색하려고 시도하지만 실패하고 빈 id 값을 사용하고있는 것으로 밝혀졌다. 여기에는 추적 로그가있다.

[main] AbstractBatcher    DEBUG about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 
[main] SQL       DEBUG 
select 
    newid() 
[main] AbstractBatcher    TRACE preparing statement 
[main] GUIDGenerator     DEBUG GUID identifier generated: 5B5495B4-FFE3-4112-B079-4FB799320BA7 
[main] AbstractBatcher    DEBUG about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
[main] AbstractBatcher    TRACE closing statement 
[main] ConnectionManager    TRACE registering flush begin 
[main] AbstractBatcher    DEBUG about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 
[main] SQL       DEBUG 
insert 
into 
    Farm 
    (FarmBusinessID, FarmName, PortalFarm, FarmID) 
values 
    (?, ?, ?, ?) 
[main] AbstractBatcher    TRACE preparing statement 
[main] BasicBinder     TRACE binding parameter [1] as [VARCHAR] - F2542B84-82E4-4DF6-BDBB-E830BFE5DDC1 
[main] BasicBinder     TRACE binding parameter [2] as [VARCHAR] - XXXXXX XXXXX (XXX) 
[main] BasicBinder     TRACE binding parameter [3] as [BIT] - true 
[main] BasicBinder     TRACE binding parameter [4] as [VARCHAR] - 5B5495B4-FFE3-4112-B079-4FB799320BA7 
[main] AbstractBatcher    DEBUG about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
[main] AbstractBatcher    TRACE closing statement 
[main] ConnectionManager    TRACE registering flush end 
[main] HQLQueryPlan     TRACE find: select id from agronomy.model.hub.Farm where id = :id 
[main] AbstractBatcher    DEBUG about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 
[main] SQL       DEBUG 
select 
    farm0_.FarmID as col_0_0_ 
from 
    Farm farm0_ 
where 
    farm0_.FarmID=? 
[main] AbstractBatcher    TRACE preparing statement 
[main] BasicBinder     TRACE binding parameter [1] as [VARCHAR] - 
[main] AbstractBatcher    DEBUG about to open ResultSet (open ResultSets: 0, globally: 0) 
[main] AbstractBatcher    DEBUG about to close ResultSet (open ResultSets: 1, globally: 1) 
[main] AbstractBatcher    DEBUG about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
[main] AbstractBatcher    TRACE closing statement 
[main] JDBCExceptionReporter   WARN SQL Error: 8169, SQLState: S0002 
[main] JDBCExceptionReporter   ERROR Conversion failed when converting from a character string to uniqueidentifier. 

은 내가 명시 적으로 마지막 SELECT (즉, 실패)를 호출하고있어 알고 아니에요, 그래서 내가 실패 왜 볼 볼 수있는 확실하지 않다. SQL 오류는 "빈 문자열을 고유 식별자 값으로 사용할 수 없으므로"의미가 통용됩니다.

답변

0

필자는 결코이 밑바닥까지 갈 수는 없지만 운이 좋았을 때 실제로 스키마가 우리의 통제하에 있었을 때이 문제를 제공하는 써드 파티 DB라고 잘못 생각했습니다.

테이블의 기본 키를 BIGINT (ID 열로 설정)로 변경하고 엔티티 ID의 데이터 유형을 Long으로 변경하여 테스트 코드를 다시 실행할 수 있었으며 엔티티가 올바르게 유지되었습니다. 데이터 베이스. 모든 것이 예상대로 진행되었고 내 말을 찢어 내고 맹세하지 않을 수있었습니다.

왜 GUID가 작동하지 않는지 궁금해 했겠지만,이 경우 수명이 너무 짧고 대안이 허용됩니다. 앞으로 비슷한 문제에 부딪 치는 사람에게 행운을 빈다.

관련 문제