복붙노트

[SPRING] Spring 데이터 JDBC : DataRetrievalFailureException : [oracle.sql.ROWID]를 [java.lang.Number]로 캐스팅 할 수 없습니다.

SPRING

Spring 데이터 JDBC : DataRetrievalFailureException : [oracle.sql.ROWID]를 [java.lang.Number]로 캐스팅 할 수 없습니다.

나는 Spring Data JDBC를 처음 사용하고 있으며, 간단한 Dto를 생성하고 DB에 저장하도록 고심하고있다.

나는 Spring-Boot 2.1.1.RELEASE와 Oracle 12 Database를 사용하고있다.

UserDto

@Table(value="USERS_T")
public class UserDto extends PersistableDto {
    @Id
    @Column(value="USR_USERNAME")
    private String userName;

    @Column(value="USR_FIRSTNAME")
    private String firstName;

    @Column(value="USR_LASTNAME")
    private String lastName; 
.....
}

UserDao

@Repository
public interface UserDao extends CrudRepository<UserDto, String> {

    @Query("SELECT * FROM USERS_T u WHERE u.USR_USERNAME = :userName")
    UserDto findByUserName(@Param("userName") String userName);
}

나는 이걸 DB에서 그대로 유지하려고 노력하고있다.

public String createUser() {
    UserDto userDto = new UserDto().setUserName("mapss@sapot.wrong.email.pt").setPassword("superpass").setUserType("Guest").setActive(true);
    logger.info(String.format("Creating user: " + userDto));

    userDto.setNew(true);
    UserDto persistedUser = userDao.save(userDto);

    logger.info(String.format("Persisted user: " + persistedUser));
    return "Ending of create user operation";
}

이 예외가 발생합니다.

org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]
        at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:79) ~[spring-jdbc-5.1.3.RELEASE.jar:5.1.3.RELEASE]
        at org.springframework.data.jdbc.core.DefaultDataAccessStrategy.getIdFromHolder(DefaultDataAccessStrategy.java:323) ~[spring-data-jdbc-1.0.3.RELEASE.jar:1.0.3.RELEASE]

나는 이것이 어떻게 든 @Id가 String이라는 사실과 관련이 있다고 믿는다.

누군가 내가 뭘 잘못하고 있는지 이해하도록 도와 줄 수 있습니까? 왜이 행동. 나는 이드의 유형에 대한 제한과 제한을 보지 못했다. Oracle과 Oracle의 통합 문제입니까? 이 문제를 어떻게 해결할 수 있습니까?

도와 주셔서 감사합니다.

해결법

  1. ==============================

    1.불행히도 오라클은 아직 완전히 지원되지 않습니다. 오라클에 대한 통합 테스트를 작성하는 데 문제가 있으며 관련 PR은 이미 일부 문제를 수정하고 있지만 모든 문제는 해결하지 않았습니다.

    불행히도 오라클은 아직 완전히 지원되지 않습니다. 오라클에 대한 통합 테스트를 작성하는 데 문제가 있으며 관련 PR은 이미 일부 문제를 수정하고 있지만 모든 문제는 해결하지 않았습니다.

    주요 문제는 오라클이 생성 된 키 생성과 관련하여 흥미로운 부분을 수행한다는 것입니다. 다음과 같은 옵션이 있습니다.

    a) 데이터베이스 측에서 키 생성을 사용하지 마십시오. DATAJDBC-282를 사용하면이 작업을보다 편리하게 수행 할 수 있습니다. 그러나 그것은 SNAPSHOT 릴리스에서만 지금까지입니다.

    b) 오라클을 사용하지 마십시오. 현재 MySql, Postgres, H2, HSQLDB 및 MariaDb로 테스트하고 있습니다.

    c) 위에서 언급 한 PR을보고 충분히 일을 패치 할 수 있는지 확인하십시오.

    나는이 옵션들이 만족스럽지 않다는 것을 알고 있습니다. 문제는 오픈 소스 프로젝트가 Oracle과의 통합 테스트를 수행하는 것이 매우 어렵다는 것입니다. 공개 CI 빌드에서 합법적 인 Oracle JDBC 드라이버를 다운로드하는 것조차도 데이터베이스가 아닌 악몽입니다.

    동료가 상황을 논의 할 때이 이미지를 보냈습니다.

    그러나 우리는 포기하지 않으며, 적절한 지원이 추가 될 것입니다.

  2. ==============================

    2.나는 같은 문제를 겪었고 PR은 다음 Spring Data JDBC 릴리스에 포함되어 있지만 Spring AOP와 함께 다음 해결 방법을 사용할 수 있습니다. "완벽"하지는 않지만 근본적인 문제가 해결 될 때까지는 충분합니다.

    나는 같은 문제를 겪었고 PR은 다음 Spring Data JDBC 릴리스에 포함되어 있지만 Spring AOP와 함께 다음 해결 방법을 사용할 수 있습니다. "완벽"하지는 않지만 근본적인 문제가 해결 될 때까지는 충분합니다.

    @Around("execution(public * my-app-pacakage.repository.*.save(..))")
    public Object aspectController(ProceedingJoinPoint jp) throws Throwable {
        try {
            return jp.proceed();
        } catch (DbActionExecutionException e) {
            if (e.getCause() instanceof DataRetrievalFailureException) {
                return jp.getArgs()[0];
            }
            return e;
        } catch(Throwable e) {
            throw e;        
        }       
    }
    
  3. ==============================

    3.당신이 엔티티에서 USR_ID 필드와 해당 시퀀스를 선언해야한다고 생각합니다.

    당신이 엔티티에서 USR_ID 필드와 해당 시퀀스를 선언해야한다고 생각합니다.

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXXX")
    @SequenceGenerator(sequenceName = "YYYY", allocationSize = 1, name = "XXXX")
    Long USR_ID;
    
  4. from https://stackoverflow.com/questions/54239345/spring-data-jdbc-dataretrievalfailureexception-unable-to-cast-oracle-sql-row by cc-by-sa and MIT license