`
elicer
  • 浏览: 133331 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Mapping boolean field to Database In open Jpa

    博客分类:
  • JPA
阅读更多
今天研究Open Jpa的文档时发现 它的 @PrePersist @PostPersist  @PostLoan这些Callback 方法 非常有用,让我们可以在entity persist 或者 load 前后做一些我们的处理,比如它解决常见的boolean field 不能跟DB 里field Mapping 的问题(Oracle and DB2 没有相应的boolean field Type)。

注意因为displayFlag是一个页面显示字段,我们是用deleteFlag来跟db里的DELETE_FLAG来mapping ,所以我们要给displayFlag加上@Transient声明,不让它成为一个可persist的field,要不然运行时会抛exception.


Example Code 如下

@Entity

@NamedQueries({
	@NamedQuery(name="magsOverPrice",
	query="SELECT x FROM Magazine x WHERE x.price > ?1"),
	@NamedQuery(name="magsByTitle",
	query="SELECT x FROM Magazine x WHERE x.title = :titleParam")
	})
@EntityListeners({MagazineListener.class})
@IdClass(Magazine.MagazineId.class)
@Table(name="MAGAZINE")
public class Magazine {
	@Id private String isbn;
	@Id private String title;
	@Column(name="PRICE")
   private BigDecimal price;
   @Column(name="SOLDCOPY")
   private int copySold;
   @Column(name="VERS")
   private int version;
   @Column(name="DELETE_FLG")
   private String deleteFlag;
   
   @Transient
   private boolean displayFlag;
   
   
   public static class MagazineId {
	   private String isbn;
	   private String title;
	   
	   
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((isbn == null) ? 0 : isbn.hashCode());
		result = prime * result + ((title == null) ? 0 : title.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final MagazineId other = (MagazineId) obj;
		if (isbn == null) {
			if (other.isbn != null)
				return false;
		} else if (!isbn.equals(other.isbn))
			return false;
		if (title == null) {
			if (other.title != null)
				return false;
		} else if (!title.equals(other.title))
			return false;
		return true;
	}
	
	
	

	public MagazineId() {

	}
	public String getIsbn() {
		return isbn;
	}
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	   
  }
   
	@PrePersist
	private void covertDisplayToDB() {
		if (this.displayFlag) {
			this.deleteFlag = "Y";
		}else {
			this.deleteFlag = "N";
		}
	}
	
	@PostLoad
	private void covertDBValueToDisplay() {
		if (this.deleteFlag != null && !this.deleteFlag.equals("") && this.deleteFlag.equals("Y")) {
			this.displayFlag = true;
		}else {
			this.displayFlag = false;
		}
	} 
public String getIsbn() {
	return isbn;
}
public void setIsbn(String isbn) {
	this.isbn = isbn;
}
public String getTitle() {
	return title;
}
public void setTitle(String title) {
	this.title = title;
}
public BigDecimal getPrice() {
	return price;
}
public void setPrice(BigDecimal price) {
	this.price = price;
}
public int getCopySold() {
	return copySold;
}
public void setCopySold(int copySold) {
	this.copySold = copySold;
}
public int getVersion() {
	return version;
}
public void setVersion(int version) {
	this.version = version;
}
public Magazine() {
	super();
}



public String getDeleteFlag() {
	return deleteFlag;
}
public void setDeleteFlag(String deleteFlag) {
	this.deleteFlag = deleteFlag;
}
public boolean isDisplayFlag() {
	return displayFlag;
}
public void setDisplayFlag(boolean displayFlag) {
	this.displayFlag = displayFlag;
}
@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((isbn == null) ? 0 : isbn.hashCode());
	result = prime * result + ((title == null) ? 0 : title.hashCode());
	return result;
}
@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	final Magazine other = (Magazine) obj;
	if (isbn == null) {
		if (other.isbn != null)
			return false;
	} else if (!isbn.equals(other.isbn))
		return false;
	if (title == null) {
		if (other.title != null)
			return false;
	} else if (!title.equals(other.title))
		return false;
	return true;
}
   
   
}





这个class 里的covertDisplayToDB 方法 用来在Magazine persist 前把页面displayFlag(boolean) 转换成DB存储的field类型 varchar.

covertDBValueToDisplay 方法用来把从DB抓出来的varchar类型的deleteFlag 转换成页面显示的dsiplayFlag.


当然我们也可以给这个entity class加上一个listener,然后把所有的Annotation的方法放在listener里。

Example Code 如下 首先给entity加上EntityListener Annotation @EntityListeners({MagazineListener.class}) 然后把我们的prePersist 跟PostLoad 的Annotation 方法移到listener中


public class MagazineListener {
	private static final Logger log = Logger.getLogger(MagazineListener.class);


	
	
	@PrePersist
	private void covertDisplayToDB(Object persistObject) {
		Magazine magazine = (Magazine) persistObject;
		if (magazine.isDisplayFlag()) {
			magazine.setDeleteFlag("Y");
		}else {
			magazine.setDeleteFlag("N");
		}
	}
	
	@PostLoad
	private void covertDBValueToDisplay(Object persistObject) {
		Magazine magazine = (Magazine) persistObject;
		if (magazine != null && magazine.getDeleteFlag() != null && !magazine.getDeleteFlag().equals("") && magazine.getDeleteFlag().equals("Y")) {
			magazine.setDisplayFlag(true);
		}else {
			magazine.setDisplayFlag(false);
		}
	} 
	
	
	
	}




0
0
分享到:
评论

相关推荐

    OpenJPA 2.2.1 API (CHM格式)

    用 OpenJPA 开发企业应用时,保持数据库和对象视图的一致性是非常重要的工作,OpenJPA 支持三种模式处理数据库和对象视图的一致性:正向映射(Forward Mapping)、反向映射(Reverse Mapping)、中间匹配(Meet-in-...

    openJpa的应用,感觉还可以

    OpenJPA(Open Java Persistence API)是Apache软件基金会下的一个开源项目,它是Java持久层标准JPA(Java Persistence API)的一个实现。JPA是Java EE平台中的一个重要组件,用于管理和处理应用程序中的对象-关系...

    openjpa jar

    6. **性能优化**:OpenJPA提供了多种性能优化选项,如延迟加载(Lazy Loading)、批处理(Batching)和结果集映射(Result Set Mapping)。通过这些设置,开发者可以平衡性能和内存消耗。 7. **插件扩展性**:...

    OpenJpaExample

    **OpenJPA简介** OpenJPA(Open Java Persistence API)是Apache软件基金会开发的一个开源对象关系映射(ORM)框架,它是Java持久层API(JPA)的一种实现。JPA是一种标准,允许开发者以面向对象的方式操作数据库,...

    Open JPA manual

    Apache OpenJPA 是一个流行的开源实现,它遵循Java持久化API(Java Persistence API,简称JPA)规范,用于对象关系映射(Object-Relational Mapping,简称ORM)和管理Java应用程序中的数据持久性。JPA是一种官方的、...

    JPA源文件/jpa学习

    JPA是Java EE和Java SE环境中的一种ORM(Object-Relational Mapping)解决方案,旨在替代Hibernate等第三方库,提供更加标准化的持久化框架。 **JPA规范**定义了应用程序与数据库交互的一组接口和API,包括实体...

    open_quadtree_mapping.bag

    open_quadtree_mapping.bag的bag文件,用于算法测试的数据

    JPA 标注 JPA标签手册

    Java Persistence API (JPA) 是Java企业版5(Java EE 5)的一部分,与Enterprise JavaBeans(EJB)3.0规范一起,极大地简化了Java持久化。它提供了一种对象关系映射方法,允许您以标准、可移植的方式声明性地定义...

    尚硅谷 jpa

    - **JPA 实现者**:除了 Hibernate 外,还有其他几个实现 JPA 的工具,例如 TopLink 和 OpenJPA。 #### 三、JPA 的优势 - **标准化**:由于 JPA 提供了统一的 API,这意味着基于 JPA 开发的应用可以在不同的 JPA ...

    jpa

    JPA通过ORM(Object-Relational Mapping)技术,将Java对象模型与关系数据库模型进行映射,从而避免了传统的JDBC编程中大量的SQL语句和数据处理。 在给定的标题“jpa”中,我们可以推测这篇博客可能详细讨论了JPA的...

    优秀实践分享 Spring Data JPA2

    本文是介绍Spring-data-jpa的PPT的学习笔记,...https://www.w3cschool.cn/java/jpa-field-mapping.html 轻松愉快之玩转SpringData-慕课网 (免费视频) https://www.imooc.com/learn/821 优秀实践项目GitHub源码分享: ...

    JPA讲解视频

    7. **关系映射(Relationship Mapping)**:JPA支持一对一、一对多、多对一和多对多的关系映射,如`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`。 8. **继承映射(Inheritance Mapping)**:JPA支持单...

    Hibernate's JPA.rar

    标题"Hibernate's JPA.rar"表明这是一个关于使用Hibernate实现Java Persistence API (JPA)的压缩文件,可能包含示例代码、配置文件或者必要的库文件。Hibernate是一个流行的对象关系映射(ORM)框架,它使得Java...

    Pro JPA 2版

    JPA2是Java Persistence API的第二个版本,是众多Java企业级开发者首选的对象关系映射(Object-Relational Mapping,简称ORM)解决方案。本书《Pro JPA 2版》是一部深入介绍JPA2的权威书籍,作者通过全面的内容和...

    JPA大全之经典全集

    JPA详解通常是对JPA的深入解析,包括实体(Entity)、持久化上下文(Persistence Context)、托管状态(Managed State)、懒加载(Lazy Loading)、级联操作(Cascading)、关系映射(Relationship Mapping)、查询...

    Open Firmware Recommended Practice: Interrupt Mapping Version 0.9

    ### Open Firmware Recommended Practice: Interrupt Mapping 版本 0.9 #### 1. 概述与背景 在计算机系统中,中断(Interrupt)是硬件设备与操作系统之间进行通信的重要方式之一。当一个设备需要处理紧急任务时,...

Global site tag (gtag.js) - Google Analytics