当 @Column 未用于所有成员时,JPA 注释的 POJO 未正确映射

JPA-annotated POJOs are not mapped correctly when @Column is not used for all members

我有一个自定义 POJO,我正在使用 JOOQ .fetchInto(TestClassDto.class) 在其上映射数据库记录。我的 POJO 中的大部分字段与数据库 table 的列完全相似。但是,有一些是不同的,因此,我添加了 java 持久性并使用 @Column 在我的 POJO 上显式映射这些列,如 here.

所述

不幸的是,如果我在一些特定字段上使用@Column,这将不起作用。仅映射带有 @Column 注释的字段,其余字段将被忽略并设置为 Null,即使它们与 table 列名称相似且应隐式映射。

如果我遗漏了什么,你能给我提示吗?

示例 POJO:

@Getter
@Setter
public class TestClassDto {

    @Column(name = "field_AB_XYZ") // explicit mapping is required, thus need @Column
    private Long myfieldAB;

    /* Here, mapping could be implicitly done without using @Column because 
    ** database column name and POJO property is same but it stays empty if I 
    ** ignore @Column */
    @Column(name = "hello_world") 
    private Long helloWorld;

}

最后,如果我从 POJO 的属性中完全删除 @ColumnhelloWorld 属性 会被(隐含地)填充,但 myfieldAb 仍然是 NULL(因为映射未按预期找到)。

下面是示例查询:

dslContext.select()
      .from(SOMETHING)
      .where(SOMETHING.NAME.eq("Something"))
      .fetchInto(TestClassDto.class)

从 jOOQ 3.15 开始,您要么必须注释

  • 你所有的属性...
  • none 你的属性...

... 带有 @Column 注释。有一个待处理的功能请求可以更紧密地模仿 JPA 并使 @Column 注释对于某些属性是可选的:https://github.com/jOOQ/jOOQ/issues/4586.

同时,您可以为您的专栏添加辅助 getters/setters,而不是使用那些 JPA 注释:

public void setFieldAbXyz(Long v) {
    this.myfieldAB = v;
}

public Long getFieldAbXyz() {
    return myfieldAB;
}