如何在JPA中不暴露@EmbeddedId结构直接访问实体字段
实现直接访问复合主键字段,隐藏EmbeddedId细节
嘿,这个需求很实用——既要保留JPA复合主键的规范,又不想让外部代码感知到id这个嵌入式主键对象的存在,直接操作A、B字段对吧?咱们有两种简洁的实现方式:
方式一:用Lombok的@Delegate一键搞定(推荐)
Lombok的@Delegate注解能帮你自动生成委托方法,把PrimaryKey里的A、B字段的Getter/Setter都“转移”到MyClass上,完全不用手动写代码:
@Entity @Data public class MyClass { @EmbeddedId @Delegate // 把PrimaryKey的所有方法委托给MyClass private PrimaryKey id; // 你的其他实体字段,比如C private String C; } @Embeddable @Data public class PrimaryKey implements Serializable { private String A; private String B; }
这样外部调用的时候,直接写myClass.getA()、myClass.setA("test")就行,跟操作普通字段一模一样,谁都不知道背后是个复合主键对象~
方式二:手动写委托方法(不依赖Lombok扩展)
如果不想用@Delegate,自己写几行委托代码也很简单,把A、B的Getter/Setter指向id的对应方法:
@Entity @Data public class MyClass { @EmbeddedId private PrimaryKey id; private String C; // 委托A的获取方法 public String getA() { return id.getA(); } // 委托A的设置方法 public void setA(String a) { id.setA(a); } // 同理处理B字段 public String getB() { return id.getB(); } public void setB(String b) { id.setB(b); } } @Embeddable @Data public class PrimaryKey implements Serializable { private String A; private String B; }
这种方式更灵活,要是你需要在Getter/Setter里加额外逻辑(比如参数校验),直接在这些委托方法里加就行。
额外小技巧:自定义数据库列名
要是需要给A、B指定数据库里的列名,直接在MyClass上用@AttributeOverrides覆盖就行,不影响外部访问:
@Entity @Data @AttributeOverrides({ @AttributeOverride(name = "A", column = @Column(name = "user_id")), @AttributeOverride(name = "B", column = @Column(name = "order_code")) }) public class MyClass { @EmbeddedId @Delegate private PrimaryKey id; private String C; }
这样既符合JPA的映射规范,又完美实现了隐藏主键结构、直接操作字段的需求~
内容的提问来源于stack exchange,提问作者Giovanni Paolo Gibilisco
相关产品推荐
相关产品推荐

