数据库
首页 > 数据库> > Spring Data JDBC:DataRetrievalFailureException:无法将[oracle.sql.ROWID]强制转换为[java.lang.Number]

Spring Data JDBC:DataRetrievalFailureException:无法将[oracle.sql.ROWID]强制转换为[java.lang.Number]

作者:互联网

我是Spring Data JDBC的新手,我正在努力创建一个简单的Dto并将其保存在数据库中.

我正在使用Spring-Boot 2.1.1.RELEASE和Oracle 12数据库.

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);
}

我只是想像这样将其持久保存在数据库中

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是字符串这一事实有关.

有人可以帮助我了解我在做什么错吗?为什么会这样.在规范上,我看不到ID的类型并受其限制.这和Oracle集成有问题吗?我怎样才能解决这个问题?

谢谢大家的帮助.

解决方法:

不幸的是,尚未完全支持Oracle.
an issue open for creating integration tests for Oracle,而accompanying PR已经解决了一些问题,但肯定不是全部.

这里的主要问题是Oracle对生成的密钥生成做了一些有趣的事情.我看到以下选项

a)不要在数据库端使用密钥生成. DATAJDBC-282使它更舒适.但是到目前为止,仅在SNAPSHOT版本中.

b)不要使用Oracle.我们目前使用MySql,Postgres,H2,HSQLDB和MariaDb进行测试

c)看一下上面提到的PR,看看是否可以打补丁以使其正常工作.

我知道这些选项不是很令人满意.
挑战在于,开源项目很难与Oracle进行集成测试,因为即使从公共CI构建中下载合法的Oracle JDBC驱动程序也是一场噩梦,更不用说数据库了.

我们讨论情况时,一位同事给我发送了这张图片:

enter image description here

但是我们不会放弃,我们会增加适当的支持.

标签:spring-jdbc,java,spring,spring-data,spring-data-jdbc
来源: https://codeday.me/bug/20191013/1906625.html