您的位置:首页 > 运维架构

【JPA】对象关系映射_访问模式(ACCESS_TYPE(field|Property))

2014-03-18 13:54 274 查看
JPA访问模式(Access model)
访问实体状态


    JPA访问模式要从持久化注解开始,持久化注解可以应用于是三个不同的级别的:类、方法和字段,可以将它们放在与类、方法或字段的同一行。持久化注解的一个作用就是用于访问实体状态,即一个实体被数据库映射时程序采用何种方式进行访问。简单来讲,当需要访问获得实体实例对象并将其存储到数据库(访问实体实例--写入数据库),或从数据库加载,将数据插入到新的实例中(读数据库--访问实体实例)。访问实体状态的方法称为访问模式(access
mode)。

访问模式的两种方式

    注解字段或注解属性。如果注解字段,则程序通过反射(reflection)来获得和设置实体字段,如果在属性的getter方法之上设置注解,那么这些getter和setter方法将提供程序调用。


 

[align=left]混合访问
 采用字段和属性相结合的方式进行实体实例访问。混合访问需要在实体实例之前注解@Access(AccessType.FIELD) ,则实体默认采用字段访问模式,而属性访问注解为@Access(AccessType.PROPERTY),比如Employee对phoneNumber进行数据转换访问存储,在存储时对phonNumber加上区号。需要在getPhoneNumberFromDb()标注属性访问,同时在字段phoneNumber注解@Transient(临时对象,不会被持久化,数据库中不会映射此字段)
[/align]

@Entity
@Access(AccessType.FIELD)
public class EmployeeMingle {

public static final String LOCAL_AREA_CODE = "613";

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@Transient private String phoneNumber; // 非持久化字段(临时属性)

/*********PHONE映射到数据列,指定访问模式为属性访问***********/
@Access(AccessType.PROPERTY) @Column(name="PHONE")
public String getPhoneNumberFromDb(){
if(phoneNumber.length()==10) {
return phoneNumber;
}else {
return LOCAL_AREA_CODE+phoneNumber;
}
}
/*********在从数据库得到数据设置employee实体时调用*******/
public void setPhoneNumberFromDb(String num) {
if(num.startsWith(LOCAL_AREA_CODE)) {
phoneNumber = num.substring(3);
}else {
phoneNumber = num;
}
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getPhoneNumber() {
return phoneNumber;
}

public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}

}

接下来进行测试说明问题:

/***
*访问属性(字段、属性混合)
* @author admin
*
*/
public class EmployeeMingleTest {

/**
* 混合访问属性数据保存到数据库
*/
@Test
public void SaveEmployee() {
EntityManagerFactory entityManagerFactory = Persistence.
createEntityManagerFactory("JPAUNIT");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();

EmployeeMingle employeeMingle = new EmployeeMingle();
// 10位号码测试:此时会调用BEAN对象的getPhoneNumberFromDb()持久化
String phoneNumber = "1324123456";

// 11位号码测试:此时会调用BEAN对象的getPhoneNumberFromDb添加区号保存到数据库
phoneNumber = "18634757543";
employeeMingle.setPhoneNumber(phoneNumber);

entityManager.persist(employeeMingle);
entityManager.getTransaction().commit();
}

/***
* 混合访问数属性数据查询
*/
@Test
public void FindEmployee() {
EntityManagerFactory entityManagerFactory = Persistence.
createEntityManagerFactory("JPAUNIT");
EntityManager entityManager = entityManagerFactory.createEntityManager();

EmployeeMingle employeeMingle = entityManager.find(EmployeeMingle.class, 2);
System.out.println("【phoneNumber】=="+employeeMingle.getPhoneNumber());

}
}
Demo源码地址:http://download.csdn.net/detail/s724073277/7060099
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐