AccessType.PROPERTY和AccessType.FIELD的区别
2013-10-24 14:28
387 查看
AccessType用来定义访问Entity的方式:
1. AccessType.PROPERTY的例子:
@Entity(access=AccessType.PROPERTY)
@Table(name = "Person")
public class Person implements Serializable {
private Long id;
// auto-generated PK
@Column(name="Id")
@Id(generator="PersonIdGenerator")
@SequenceGenerator(name="PersonIdGenerator", sequenceName="PersonIdGenerator")
public Long getId() {
return id;
}
public void setId(Long personId) {
this.id = personId;
}
......
}
2. AccessType.FIELD的例子:
@Entity(access=AccessType.FIELD)
@Table(name = "Country")
public class Country implements Serializable {
@Id(generator="CountryIdGenerator")
@SequenceGenerator(name="CountryIdGenerator", sequenceName="CountryIdGenerator")
@Column(name="CountryId")
public Long countryId;
@Column(name="Name", length=128, nullable=false)
public String name;
......
}
AccessType.PROPERTY: The EJB persistence implementation will load state into your class via JavaBean "setter" methods, and retrieve state from your class using JavaBean "getter" methods. This is the default.
--> 通过getter和setter方法访问Entity的变量,可以把变量定义为private;
--> 需要在getter方法上定义字段的属性;
AccessType.FIELD: State is loaded and retrieved directly from your class' fields. You do not have to write JavaBean "getters" and "setters".
--> 直接访问Entity的变量,可以不定义getter和setter方法,但是需要将变量定义为public;
--> 需要在变量上定义字段的属性;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
一、xml配置时的写法:
随着Hibernate版本的不断升级,一些内部机制也不断的在变化,老版本的Hibernate不用设置属性直接设置set、get方法就能存取数据,也就是说Hibernate实体类默认访问set、get方法。
即:持久化类中没有声明name变量,但只要有getName(),和setName()的方法存在,并且在Xyz.hbm.xml中映射过name变量
(<property name=”name” column=”NAME”/>),Hibernate就允许利用get和set方法从数据库中对字段NAME进行操作。
但是如果在声明中加入
<property name=”name” column=”NAME” access=”field”>那么程序运行时,Hibernate就会直接访问Xyz实例所对应的持久化类的name变量属性,而不是先去访问getName()和setName()方法,如果name变量属性不存在则会抛出net.sf.hibernate.PropertyNotFoundException异常。
【注】:显示的声明<property name=”name” column=”NAME” access=”property”
/>表示不用反射机制访问实体类属性,而是显示的访问set、get方法存取数据。[老版本的Hibernate默认是access=”property”,新版本的Hibernate默认是access=” field ”]
------------------------------------------------------------------------------------------------------------------------------------------
二、JPA注解模式的写法:
Hibernate注解模式是在3.0以后的版本出现的,但3.0之后又出了几个版本,随着版本的升级在实体类里的注解写法也有些变化,老一点儿版本的写法是@AccessType("property")或@AccessType("field"),而新一点儿版本的写法为@Access(AccessType.PROPERTY)或@Access(AccessType.FIELD),Hibernate注解模式的默认属性是field,这个跟xml配置的写法不一样,因为Hibernate注解模式是否有主键ID注解是有要求的。
@Access(AccessType.PROPERTY)这个注解既可以写到实体类的上面来标识整个实体类,也可以写在某一个持久化属性的上面只用来标识这一个属性。如果放在实体类上面标识实体类的时候要求这个实体类必须有主键ID的标识设置,否则加上@Access(AccessType.PROPERTY)属性后会报错的。
一般来说@Access(AccessType.PROPERTY)注解都是写在某个持久化属性上面的,因为这样跟这个实体类是否设置主键ID没关系,一般是要在某个持久化属性的set或get方法里给其他属性做复杂处理的时候在写@Access(AccessType.PROPERTY)注解的,也就是说要求这个持久化属性必须走set或get方法。
例如:
@Access(AccessType.PROPERTY)
private String deptype;
@Transient //代表这个属性是非持久化属性
private String pid;
public String getDeptype() {
return this.deptype;
}
public void setDeptype(String deptype) {
this.deptype = deptype;
this.pid = deptype.substring(deptype.length()-3).trim();
if("".equals(pid)) {pid = "000";}
}
1. AccessType.PROPERTY的例子:
@Entity(access=AccessType.PROPERTY)
@Table(name = "Person")
public class Person implements Serializable {
private Long id;
// auto-generated PK
@Column(name="Id")
@Id(generator="PersonIdGenerator")
@SequenceGenerator(name="PersonIdGenerator", sequenceName="PersonIdGenerator")
public Long getId() {
return id;
}
public void setId(Long personId) {
this.id = personId;
}
......
}
2. AccessType.FIELD的例子:
@Entity(access=AccessType.FIELD)
@Table(name = "Country")
public class Country implements Serializable {
@Id(generator="CountryIdGenerator")
@SequenceGenerator(name="CountryIdGenerator", sequenceName="CountryIdGenerator")
@Column(name="CountryId")
public Long countryId;
@Column(name="Name", length=128, nullable=false)
public String name;
......
}
AccessType.PROPERTY: The EJB persistence implementation will load state into your class via JavaBean "setter" methods, and retrieve state from your class using JavaBean "getter" methods. This is the default.
--> 通过getter和setter方法访问Entity的变量,可以把变量定义为private;
--> 需要在getter方法上定义字段的属性;
AccessType.FIELD: State is loaded and retrieved directly from your class' fields. You do not have to write JavaBean "getters" and "setters".
--> 直接访问Entity的变量,可以不定义getter和setter方法,但是需要将变量定义为public;
--> 需要在变量上定义字段的属性;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
一、xml配置时的写法:
随着Hibernate版本的不断升级,一些内部机制也不断的在变化,老版本的Hibernate不用设置属性直接设置set、get方法就能存取数据,也就是说Hibernate实体类默认访问set、get方法。
即:持久化类中没有声明name变量,但只要有getName(),和setName()的方法存在,并且在Xyz.hbm.xml中映射过name变量
(<property name=”name” column=”NAME”/>),Hibernate就允许利用get和set方法从数据库中对字段NAME进行操作。
但是如果在声明中加入
<property name=”name” column=”NAME” access=”field”>那么程序运行时,Hibernate就会直接访问Xyz实例所对应的持久化类的name变量属性,而不是先去访问getName()和setName()方法,如果name变量属性不存在则会抛出net.sf.hibernate.PropertyNotFoundException异常。
【注】:显示的声明<property name=”name” column=”NAME” access=”property”
/>表示不用反射机制访问实体类属性,而是显示的访问set、get方法存取数据。[老版本的Hibernate默认是access=”property”,新版本的Hibernate默认是access=” field ”]
------------------------------------------------------------------------------------------------------------------------------------------
二、JPA注解模式的写法:
Hibernate注解模式是在3.0以后的版本出现的,但3.0之后又出了几个版本,随着版本的升级在实体类里的注解写法也有些变化,老一点儿版本的写法是@AccessType("property")或@AccessType("field"),而新一点儿版本的写法为@Access(AccessType.PROPERTY)或@Access(AccessType.FIELD),Hibernate注解模式的默认属性是field,这个跟xml配置的写法不一样,因为Hibernate注解模式是否有主键ID注解是有要求的。
@Access(AccessType.PROPERTY)这个注解既可以写到实体类的上面来标识整个实体类,也可以写在某一个持久化属性的上面只用来标识这一个属性。如果放在实体类上面标识实体类的时候要求这个实体类必须有主键ID的标识设置,否则加上@Access(AccessType.PROPERTY)属性后会报错的。
一般来说@Access(AccessType.PROPERTY)注解都是写在某个持久化属性上面的,因为这样跟这个实体类是否设置主键ID没关系,一般是要在某个持久化属性的set或get方法里给其他属性做复杂处理的时候在写@Access(AccessType.PROPERTY)注解的,也就是说要求这个持久化属性必须走set或get方法。
例如:
@Access(AccessType.PROPERTY)
private String deptype;
@Transient //代表这个属性是非持久化属性
private String pid;
public String getDeptype() {
return this.deptype;
}
public void setDeptype(String deptype) {
this.deptype = deptype;
this.pid = deptype.substring(deptype.length()-3).trim();
if("".equals(pid)) {pid = "000";}
}
相关文章推荐
- 三维建模的相关网站或者博客参考集锦
- Install ServiceDesk Plus as a Linux Service
- 用户和组
- 深入理解硬盘的Linux分区
- Linux 系统的目录结构
- 深入理解硬盘的Linux分区
- 浅谈如何用We7站群平台打造垂直性政务网站
- Linux有用命令及热键(个人备忘)
- df命令
- ARM Linux下UPnP使用
- gzip命令
- linux awk命令详解
- /etc/group文件详解
- chown命令
- chgrp命令
- Linux_Bash脚本_bc浮点计算器、进制转换
- tar命令
- linux tar命令难点要点
- chmod命令
- 用SecureCRT来上传和下载文件