为什么有人在使用 JPA 映射类时要在 getter 或 setter 上放置注释?
2022-09-01 04:25:16
主题说明了一切...到目前为止,我认为人们在 getter 和/或 setter 上声明注释没有任何好处。对我来说,这只有将注释分散到类上的缺点,这会使类更不可读。
将注释放在字段上可以明显减少需要帮助时要发布的代码量。不过,这只是一个很小的优势。但是,在方法上添加注释对我来说没有任何意义。
主题说明了一切...到目前为止,我认为人们在 getter 和/或 setter 上声明注释没有任何好处。对我来说,这只有将注释分散到类上的缺点,这会使类更不可读。
将注释放在字段上可以明显减少需要帮助时要发布的代码量。不过,这只是一个很小的优势。但是,在方法上添加注释对我来说没有任何意义。
在方法上放置注释会强制 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 ...
}
在 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 ...
}
为什么有人在使用 JPA 映射类时要在 getter 或 setter 上放置注释?
如前所述,如果需要,使用属性访问允许在 getter 中添加逻辑。
但是由于这个问题被标记为休眠状态,我将提到另一个(巨大的)好处:属性访问允许您在不初始化代理的情况下调用foo.getId()。
使用字段访问时,您不能获得相同的行为。Emmanuel Bernard将现场访问的这种局限性解释如下:
这是不幸的,但也是意料之中的。这是字段级访问的限制之一。基本上,我们没有办法知道getId()确实只去访问id字段。因此,我们需要加载整个对象以确保安全。
所以,是的,使用属性访问会使代码更难阅读,例如,您必须浏览整个类以查看周围是否有任何。但对我来说,好处(至少在冬眠时)远远超过了这个缺点。@Transient