在使用JPA映射类时,为什么有人会在getter或setter上添加注释?

Kaw*_*awu 36 java mapping annotations hibernate jpa

主题说明了一切......到目前为止,我认为人们没有在吸气剂和/或制定者上声明注释的优势.对我来说,这只会带来在类上传播注释的缺点,这会使类更难以理解.

将注释放在字段上会明显减少需要帮助时要发布的代码量.这只是一个很小的优势.但是对方法进行注释对我没有任何意义.

axt*_*avt 42

在方法上添加注释会强制JPA通过方法访问属性.当对象的内部状态与数据库模式不同时,这是有意义的:

@Entity
public class Employee {
    private String firstName;
    private String lastName;

    @Column(name = "EMP_NAME") // Due to legacy database schema
    public String getName() {
        return fisrtName + " " + lastName;
    }

    public void setName(String name) {
        ...
    }

    ... Getters and setters for firstName and lastName with @Transient ...
}
Run Code Online (Sandbox Code Playgroud)

在JPA 2.0中,您可以使用以下命令指定细粒度级别的访问类型@Access:

@Entity @Access(AccessType.FIELD)
public class Employee {
    @Access(AccessType.PROPERTY) @Column(name = "EMP_NAME")
    public String getName() { ... }
    ... other properties have field access ...
}
Run Code Online (Sandbox Code Playgroud)


Pas*_*ent 23

在使用JPA映射类时,为什么有人会在getter或setter上添加注释?

如前所述,如果需要,使用属性访问允许在getter中添加逻辑.

但由于问题被标记为,我将提到另一个(巨大的)好处:属性访问允许您在foo.getId() 不初始化代理的情况下调用.使用字段访问时,您无法获得相同的行为.Emmanuel Bernard解释了现场访问的这种限制如下:

这是不幸的,但预计.这是字段级访问的限制之一.基本上我们无法知道getId()确实只能访问id字段.所以我们需要加载整个对象才能安全.

所以,是的,使用属性访问会使代码更难阅读,例如,您可以浏览整个类以查看是否存在任何类@Transient.但对我来说,这个好处(至少在)远远超过了这个劣势.

相关问题

参考