›
› 分享
放大字体
缩小字体
JPA映射注解(Annotation)可以加在类的字段(Field)上,也可以加在属性(Property)上,刚开始对这两个称呼感觉很糊涂,不知道有什么区别。因为认为字段与属性应该是一个东西。通常属性,字段,成员变量都看成一个东西,区别于方法的。 但在JPA里这两个概念是不一样的,JPA映射中的字段就是通常认为的类的字段,但这里的属性不是指类的属性,而是指JavaBean的属性,JavaBean风格的java代码都有getter与setter方法,比如如果有个JavaBean属性为myName,那么必须要有getMyName和setMyName方法,如:
class SomeClass{
private String name;
private String myName;
private void setMyName(String name){
this.name = name;
}
public String getMyName(){
return name;
}
}
在这个例子中,name是JPA中说的字段Field,myName是JPA说的属性Property,如果把映射注解加到字段Field:
@Column(name="dbcolumn")
private String name;
JPA的实现(如Hibernate)从数据库中加载对象的状态或者把对象的状态保存到数据库中的时候是直接访问类的字段Field,如someObject.name,没有通过相关的getter,setter方法。这与该字段的访问限制(public|private)没有关系,都可以访问到
如果把映射注解加在JavaBean的属性Property上:
@Column(name="dbcolumn")
public String getMyName(){
那么JPA从数据库中加载对象的状态或者把对象的状态保存到数据库中时是通过访问器(accessor:getter,seeter)如setMyName(),getMyName()取得对象的状态的。
JavaBean的属性名字就是myName,根据JavaBean的要求,必须有一个getMyName和setMyName方法,这与字段myName没有必然的联系,并不是说必须要是getName和setName 如果认为直接访问对象的字段不好,可以把注解定义在JavaBean的属性上,觉得他们没有什么区别,唯一的区别可能是如果把注解加在JavaBean的属性上的话,在getter,setter方法中我们可以在读取或者保存对象的状态时做一些操作。一个类及其继承结构的注解只能统一的加在一个地方,不能同时加到字段或者属性上