我正在阅读Beginning Java EE6 Platform和Glassfish 3一书,在理解字段/属性的Access类型时遇到一些小麻烦。他们两个有什么区别?
JPA实现(在本例中为EclipseLink)是如何读取/设置属性的?比如,如果它是属性访问,则可以通过可能的验证来读取/设置值,这些值可以放在get / set方法中,而字段访问选项不通过这些方法设置/获取值,而是直接在字段上?类型是否由我放置@Id注释的位置设置?
答案 0 :(得分:7)
@Access注释类型指示JPA应如何设置或获取对象中的字段。一个AccessType.FIELD JPA将使用反射直接设置字段,并且不会使用任何提供的setter方法。如果您的类通过setter方法跟踪字段的“脏”,则非常有用。相反,设置@Access(value=AccessType.PROPERTY)
将指示JPA在访问字段时使用setter和getter方法。
您可以通过向setter方法添加日志记录或System.out.println
,然后对@Access
注释进行更改来证明这一点。例如:
@Id
@Access(value=AccessType.PROPERTY)
private Long Id;
public void setId(Long id) { System.out.println("SET"); this.Id = id; }
将打印SET
和此:
@Id
@Access(value=AccessType.FIELD)
private Long Id;
public void setId(Long id) { System.out.println("SET"); this.Id = id; }
不会!
放置注释的位置也无关紧要,至少在Hibernate中; - )。