【问题标题】:How to expose fields of and @EmbeddedId如何公开和@EmbeddedId 的字段
【发布时间】:2018-10-12 08:45:46
【问题描述】:

我有一个@Entity,其中包含三个字段 A、B、C,其中 A 和 B 充当复合主键。我创建了一个包含 A 和 B 的 @EmbeddedId 类。为了减轻定义 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 将每个文件标记为@Idsuggested in this answer,但如果我仍然需要使用@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?

【问题讨论】:

    标签: java hibernate jpa lombok


    【解决方案1】:

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

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

    然后您可以直接从 MyClass 设置/获取 PrimaryKey 字段。 Here 是一个链接,供您阅读更多信息。

    【讨论】:

    • 据报道 here 注释现在被标记为实验性的,并且在未来的版本中可能会删除支持。
    【解决方案2】:

    您可以将 AccessLevel 与 @Getter 和 @Setter 一起使用,如下所示:

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

    使用@Data 时,默认情况下您对访问器具有公共访问权限,使用 AccessLevel.NONE 将覆盖默认行为,并且不允许访问访问器。

    【讨论】:

    • 我的问题与直接从 MyClass 对 PrimaryKey 字段的代理访问更相关,但如果需要,这仍然是隐藏 PrimaryKey 的好方法。正如下一个答案中所指出的,应该与@Delegate 一起使用
    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多