java - Spring Data JDBC : DataRetrievalFailureException : Unable to cast [oracle. sql.ROWID] 到 [java.lang.Number]

标签 java spring spring-data spring-jdbc spring-data-jdbc

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

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

用户Dto

@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("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0f626e7f7c7c4f7c6e7f607b21787d606168216a626e6663217f7b" rel="noreferrer noopener nofollow">[email protected]</a>").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 Oracleaccompanying PR已经解决了一些问题,但肯定不是全部。

这里的主要问题是 Oracle 在生成 key 生成方面做了一些有趣的事情。我看到以下选项

a) 不要在数据库端使用 key 生成。 DATAJDBC-282让这更舒适。但到目前为止仅在 SNAPSHOT 版本中。

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

c) 查看上面提到的 PR,看看是否可以对其进行足够的修补以使其正常工作。

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

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

enter image description here

但我们不会放弃,适当的支持将会增加。

关于java - Spring Data JDBC : DataRetrievalFailureException : Unable to cast [oracle. sql.ROWID] 到 [java.lang.Number],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54239345/

相关文章:

spring - @configuration在spring中的实际用法是什么?

java - 将 Eclipse 中的现有源代码包含到 Android Studio 中

Java多维数组

java - 为什么在 DirectByteBuffer 中使用 '<< 0'

spring - Transactional TestNG 测试导致 Large Objects 可能无法在自动提交模式下使用

spring-data - 如何使用 java config 配置审计

java - 如何编写使用Azure SDK的测试?

java - Spring AOP aop :after running early

java - 如何在 Spring MVC 中使用 xml 配置提供默认 bean 实现?

java - Spring data Elasticsearch 中的 DataTableRepository