我总是确定(不知道为什么)最好为变量添加注释,但在浏览Hibernate doc http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection时,我注意到它们倾向于注释方法。所以我应该在方法之前加注我的注释,如下:
@Entity
public class Flight implements Serializable {
private long id;
@Id @GeneratedValue
public long getId() { return id; }
public void setId(long id) { this.id = id; }
}
或者这样做更好:
@Entity
public class Flight implements Serializable {
@Id @GeneratedValue
private long id;
public long getId() { return id; }
public void setId(long id) { this.id = id; }
}
或者也许没有区别?
答案 0 :(得分:3)
正如Péter指出的那样,你需要选择一种风格并坚持使用它,因为@Id
注释采用的风格将用于所有事物。
除此之外,这只是品味问题。这两个选项都有效,所以选择你喜欢的选项。有些人更喜欢Hibernate通过方法注入,以便他们可以根据需要巧妙地改变实现。我更喜欢通过字段注入,因为我发现通过getter / setter方法(7行对1行)暴露所有属性很麻烦,当它们在99.9%的时间内它们将作为简单变量工作时(在任何情况下)如果/当我需要编写自定义setter功能时,我可以切换注释样式。)
两者之间没有任何性能或功能差异,因此请选择您喜欢的(或者更重要的是,无论您的团队/工具更喜欢哪种方式)。
答案 1 :(得分:2)
使用@Id
注释,有一个区别:如果它在getter上,Hibernate尝试通过常规getter / setter获取/设置所有类成员,而如果它在成员变量上,则Hibernate将直接访问所有成员变量。
换句话说,你不能在同一个实体中混合样式。
答案 2 :(得分:1)
这取决于注释。
一般来说,如果实体具有与字段名称匹配的标准getter / setter,则没有太大区别。我倾向于在给出选择时注释字段,只是因为我发现将注释埋没在方法中以便更难阅读。
答案 3 :(得分:1)
能够选择放置它们的位置有时候很方便,特别是当场地没有公开曝光时。私有getter / setter并不常见,所以能够在字段上添加注释是很有用的。
有时也可以灵活地使用外部/内部数据表示。这是一个有点愚蠢的例子,但我已经使用了几次类似的技巧(here和here):
@Column(...)
private String email;
public String getAlias() { ... split email and return the part before @ ... }
public void setAlias( String alias ) { ... change the part before the @ ... }
public String getHost() { ... split email and return the part after @ ... }
public void setHost(String host) { ... change the part after the @... }
一般来说,我倾向于将它们放在字段上,我发现代码更具可读性。但这主要是品味问题。强制执行的唯一规则就是坚持!
答案 4 :(得分:0)
答案 5 :(得分:0)
我强烈建议在变量之上使用注释,而不是在方法上使用注释。这不是味道。如果要声明从Spring Security实现UserDetails的USER类,这是强制性的。 因此,下面的代码将起作用,这是唯一的方法。
@Entity
class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany
private List<UserRole> roles;
//....Setters and Getters..........
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public boolean isAccountNonExpired() {
return false;
}
@Override
public boolean isAccountNonLocked() {
return false;
}
@Override
public boolean isCredentialsNonExpired() {
return false;
}
@Override
public boolean isEnabled() {
return false;
}
如果您将所有注释放在函数getter中,而不映射@OneToMany
或@ManyToMany
......它将起作用,但如果您需要使用这些关系,那么Hibernate将会中断。我认为Hibernate已经在变量之上使用了注释,因此出于一致的原因,它不喜欢函数顶部的注释。
因此,坚持使用框架的常规内容,您不会在以后将代码分解。