2014-11-05 8 views
1

MSSQL (2008)과는 EclipseLink를 반환 (2.4)은 EclipseLink 레코드 삽입 잘못된 ID를

나는이는 EclipseLink를 발생하면 다른 테이블에

를 삽입을하는 트리거가있는 테이블에 삽입하고있어이 ID를 반환 트리거에 의해 다른 테이블에 삽입 된 레코드의

EcliipseLink에서 @@ IDENTITY 대신 SCOPE_IDENTITY()를 사용하여 올바른 ID를 얻을 수 있다고 가정합니다.

질문은 어떻게해야합니까?

EclipseLink (JPA)에 대한 솔루션이 필요합니다. SQL을 사용하여 ID를 얻는 방법을 알고 있습니다.

+0

는') (@IDImAfter = SCOPE_IDENTITY을 선택' 트리거가 삽입되는 테이블 대신 삽입하려는 테이블에서 ID를 반환합니다. – Fred

+0

EclipseLink 용 솔루션이 필요하다는 것을 명확히하기 위해 제 질문을 편집했습니다. 나는 SCOPE_IDENTITY()가 id를 리턴한다는 것을 잘 알고있다. 문제는 EclipseLink가 그것을 얻는 것이다. –

답변

0

TableA에는 다른 테이블에 삽입되는 트리거가 있습니다. 당신은이 TableA에 레코드를 삽입하고 그 기록의 ID를 반환합니다

INSERT INTO TableA (Field1, Field2) VALUES (@Value1, @Value2); SELECT SCOPE_IDENTITY() As MyRecID

.. 같은 명령을 실행합니다. 더 많은 정보를 들어

여기에이 문제를 해결하기는 EclipseLink에 사용자 정의 시퀀스 객체를 추가하는 예제가 SCOPE_IDENTITY (Transact-SQL)

+0

EclipseLink 용 솔루션이 필요하다는 것을 명확히하기 위해 제 질문을 수정했습니다. 나는 SCOPE_IDENTITY()가 id를 리턴한다는 것을 잘 알고있다. 문제는 EclipseLink가 그것을 얻는 것이다. –

0
+1

불행히도 그 예는 매우 오래되었습니다. 또한 IDENT_CURRENT를 사용하여 테이블에 대한 모든 연결에서 모든 삽입의 마지막 ID를 리턴합니다. EclipseLink에서 연결을 풀링하고 다른 연결에서 SCOPE_IDENTITY를 호출하면 null이 반환되는 것처럼 간단하게 SCOPE_IDENTITY로 전환 할 수 없습니다! –

+0

시퀀스에서 ShouldAcquireValueAfterInsert 플래그가 true로 설정되어 있습니까? 또 다른 대안은 SQLServerPlatform의 하위 클래스를 만들고 buildSelectQueryForIdentity 메서드를 재정 의하여 자신의 쿼리를 반환하는 것입니다. 그런 다음 http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_target_database.htm – Chris

+0

을 사용하여 지속성 단위에 추가됩니다. scope_identity()를 사용하도록 SQLServerPlatform을 서브 클래스 화했으며, 여전히 null을 반환했습니다. 그런 다음 JDBC를 통해 scope_identity를 직접 사용해 보았지만 여전히 null을 반환했습니다! JDBC를 통해 ID를 얻을 수있는 유일한 방법은 쿼리를 실행하는 데 사용 된 문 개체에서 getGeneratedKeys를 사용하는 것이 었습니다. –