如何使用 lombok 构建器语法对具有组合键的实体执行插入查询

问题描述 投票:0回答:1

我正在使用 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;
// ...
}
java spring-boot spring-data-jpa lombok insert-query
1个回答
0
投票

您可以使用

@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());
        };
    }
© www.soinside.com 2019 - 2024. All rights reserved.