如何公开和@EmbeddedId 的字段

How to expose fields of and @EmbeddedId

我有一个 @Entity,其中包含三个字段 A、B、C,其中 A 和 B 充当复合主键。我创建了一个 @EmbeddedId class 来保存 A 和 B。为了减轻定义 getter 和 setter 的负担,我使用了 lombok @Data 注释。

@Entity
@Data
public class MyClass {
    @EmbeddedId
    private PrimaryKey id;
}

@Embeddable
@Data
public class PrimareyKey implements Serializable {
    private String A;
    private String B;
}

我不想公开 A 和 B 是主键并以相同的方式访问 A 和访问所有字段。

//Exposes primary key
myObject.getid().getA();
myObject.getid().getB();
myObject.getC();

//Hides primary key
myObject.getA();
myObject.getB();
myObject.getC();

目前可以使用 @IdClass 将每个文件标记为 @Id 但如果我仍然需要使用 @EmbeddedId (或任何 @Embedded 实际上) 实现此目的的唯一方法(我知道)是编写绕过 id 变量的临时 getter 和 setter,例如

@Entity
@Data
public class MyClass {
    @EmbeddedId
    private PrimaryKey id;

    public String A getA(){
        return id.getA()
    }

    public String A setA(String a){
        id.setA(a);
    }
    //same for B and any other fiels in PrimaryKey

}

这看起来需要编写和维护大量样板代码。

是否有注释公开 @EmbeddedId getter 和 setter?

在 MyClass 中,将 Lombok @Delegate 注释添加到您的主键。它应该看起来像:

@Entity
@Data
public class MyClass {
    @Delegate
    @EmbeddedId
    private PrimaryKey id;
}

然后您可以 set/get 直接从 MyClass 中获取主键字段。 Here 是一个 link 供您阅读更多相关信息。

您可以使用 @Getter 和 @Setter 的访问级别,如下所示:

@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private PrimaryKey id;

当使用@Data 时,默认情况下您有 public 访问访问器,使用 AccessLevel.NONE 将覆盖默认行为并且不允许访问访问器。