我正在使用 Spring Boot 版本 3.1.7,我正在尝试对数据库执行插入查询,该数据库有一个我内省的表来创建一个实体类,它由 3 个主键和一个主键类组成是自动生成的。
我的问题是每当我尝试保存我创建的对象(使用 lombok 构建器语法)时,我都会收到此错误
org.springframework.dao.InvalidDataAccessApiUsageException:提供的 id 类型错误:实体“com.sageapservice.entity.mssql.Apibs”的 id 类型为“class com.sageapservice.entity.mssql.ApibsPK”,但提供的 id 类型为“class” java.lang.Integer'
(Apibs中的类名,主键类为ApibsPK)
我尝试像平常一样为函数提供值,但我收到了上面突出显示的错误。我还尝试创建 PK 类的对象并将其作为实体的 ID 传递,但由于构建器函数不会接受尚不属于实体类的字段。
我什至无法运行该程序。
这是我的实体类的一部分
@Entity
@AllArgsConstructor
@Builder
@NoArgsConstructor
@IdClass(ApibsPK.class)
public class Apibs {
@Id
@Column(name = "CNTBTCH", nullable = false, precision = 0)
private int cntbtch;
@Id
@Column(name = "CNTITEM", nullable = false, precision = 0)
private int cntitem;
@Id
@Column(name = "CNTPAYM", nullable = false, precision = 0)
private int cntpaym;
@Basic
@Column(name = "AUDTDATE", nullable = false, precision = 0)
private int audtdate;
@Basic
@Column(name = "AUDTTIME", nullable = false, precision = 0)
private int audttime;
@Basic
@Column(name = "AUDTUSER", nullable = false, length = 8)
private String audtuser;
@Basic
@Column(name = "AUDTORG", nullable = false, length = 6)
private String audtorg;
@Basic
@Column(name = "DATEDUE", nullable = false, precision = 0)
private int datedue;
// ...
}
这是我PK课上的
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ApibsPK implements Serializable {
@Column(name = "CNTBTCH", nullable = false, precision = 0)
@Id
private int cntbtch;
@Column(name = "CNTITEM", nullable = false, precision = 0)
@Id
private int cntitem;
@Column(name = "CNTPAYM", nullable = false, precision = 0)
@Id
private int cntpaym;
// ...
}
您可以使用
@EmbeddedId
作为复合键,如下所示。
创建一个包含所有主键列的 @Embeddable
类。
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Embeddable
public class ApibsPK implements Serializable {
@Column(name = "CNTBTCH", nullable = false, precision = 0)
private int cntbtch;
@Column(name = "CNTITEM", nullable = false, precision = 0)
private int cntitem;
@Column(name = "CNTPAYM", nullable = false, precision = 0)
private int cntpaym;
}
您的实体类使用上述类作为
@EmbeddableId
@Entity
@AllArgsConstructor
@Builder
@NoArgsConstructor
public class Apibs implements Serializable {
@EmbeddedId
private ApibsPK apibsPK;
@Basic
@Column(name = "AUDTDATE", nullable = true, precision = 0)
private int audtdate;
@Basic
@Column(name = "AUDTUSER", nullable = true, length = 8)
private String audtuser;
// removing other column for brevity.
}
创建如下界面
@Repository
public interface ApibsRepository extends JpaRepository<Apibs, ApibsPK> {
}
使用 lombok 构建器模式设置所需的值并调用 save() 方法将记录保存在数据库中。
@Bean
CommandLineRunner commandLineRunner() {
return args -> {
apibsRepository.save(Apibs.builder()
.apibsPK(ApibsPK.builder()
.cntitem(1)
.cntbtch(2)
.cntpaym(3)
.build())
.build());
};
}