gpt4 book ai didi

java - 使用手动 PK(不是自动生成的)使用 Spring 数据 JDBC CrudRepository 插入 oracle

转载 作者:行者123 更新时间:2023-11-30 10:06:48 25 4
gpt4 key购买 nike

<分区>

我在使用 Spring Data JDBC v1.0.4(不是 JPA)插入 Oracle DB 时遇到以下错误:

Caused by: 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.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.data.jdbc.core.DefaultDataAccessStrategy.getIdFromHolder(DefaultDataAccessStrategy.java:323) ~[spring-data-jdbc-1.0.4.RELEASE.jar:1.0.4.RELEASE]
at org.springframework.data.jdbc.core.DefaultDataAccessStrategy.insert(DefaultDataAccessStrategy.java:111) ~[spring-data-jdbc-1.0.4.RELEASE.jar:1.0.4.RELEASE]
at org.springframework.data.jdbc.core.DefaultJdbcInterpreter.interpret(DefaultJdbcInterpreter.java:73) ~[spring-data-jdbc-1.0.4.RELEASE.jar:1.0.4.RELEASE]
at org.springframework.data.relational.core.conversion.DbAction$InsertRoot.doExecuteWith(DbAction.java:110) ~[spring-data-jdbc-1.0.4.RELEASE.jar:1.0.4.RELEASE]
at org.springframework.data.relational.core.conversion.DbAction.executeWith(DbAction.java:55) ~[spring-data-jdbc-1.0.4.RELEASE.jar:1.0.4.RELEASE]

似乎默认实现总是需要一个自动生成的键,但我的表的主键是一个字符串。

要持久化的实体:

@Table("USERS")
public class User implements Persistable<String> {

@Transient
@JsonIgnore
private boolean newRow = false;

@Id
@Column("ID_USER")
private String userId;

@Column("NAME")
private String name;

@Override
@JsonIgnore
public String getId() {
return userId;
}

public void setNew(boolean newRow) {
this.newRow = newRow;
}

@Override
@JsonIgnore
public boolean isNew() {
return newRow;
}

}

存储库:

@Repository
public interface UserRepository extends CrudRepository<User, String>, PagingAndSortingRepository<User, String> {

}

对存储库的调用:

public User create(User user) throws QOException {
user.setNew(true);
return userRepository.save(user);
}

org.springframework.data.jdbc.core.DefaultDataAccessStrategyinsert方法的最后一行抛出异常:

operations.update( //
sql(domainType).getInsert(parameters.keySet()), //
parameterSource, //
holder //
);
// Next line is the problem
return getIdFromHolder(holder, persistentEntity);

问题是 KeyHolder 接口(interface)有一个方法 getKey 返回一个 Number 并且 Oracle 返回作为生成的 KEY ROWID ...但是实体 PK 没有生成,ID 是在插入之前设置的.

我无法理解该代码有什么问题,欢迎任何帮助。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com