【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]
接下来进行测试说明问题:
访问实体状态
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
相关文章推荐
- JPA字段/属性访问策略(JPA field access strategy)
- AccessType.PROPERTY和AccessType.FIELD的区别
- Hibernate AccessType.PROPERTY和AccessType.FIELD的区别
- AccessType.PROPERTY和AccessType.FIELD的区别
- How to obtain access to an ActiveX control from its property page 如何从一个控件的属性页中获取对该控件的访问?
- org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type sette
- Request header field Content-Type is not allowed by Access-Control-Allow-Headers跨域
- Types的Type访问模式
- JavaScript访问GridView的绑定列(Access the Bound field of Gridview by javascript)
- 论基于数据访问的集合类(Data Access Based Collection)和领域事件(Domain Event)模式
- Request header field Content-Type is not allowed by Access-Control-Allow-Headers跨域
- 论基于数据访问的集合类(Data Access Based Collection)和领域事件(Domain Event)模式 .
- org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type sette
- 突发访问模式 burst access mode
- 错误码:Uncaught TypeError: Cannot read property 'field' of undefined
- 提高C#编程水平的50个要点 之一“总是用属性 (Property) 来代替可访问的数据成员(field)”
- Spring Data JPA: No property foo found for type Bar
- 9.如何解决出现AXIOS的Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
- [译文]JPA的实施模式:域访问和属性访问之间的比较
- org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.xugao.bean.MemberLevel.memberpointrate