码迷,mamicode.com
首页 > 其他好文 > 详细

JPA实体基本映射

时间:2015-08-02 16:51:39      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:

 

 1.前言

JPA可以使用XML映射文件来管理实体与数据表之间的映射关系,但在实际开发中,绝大部分情况都是采用Annotation来管理实体和数据表的映射关系。本篇着重来讲解一下JPA中采用注解形式来映射实体。

 2.JPA属性注入

2.1.常用注解

@Entity:被该注解修饰的POJO就是一个实体

@Table:该注解反应的是所映射的一个表

@Column:该字段用来修饰多要描述的属性


2.2.@Transient

在默认情况下,实体类的Field会自动映射到数据表的数据列,如果不想映射的话,可以采用该字段修饰。

@Entity
@Table(name="news_table")
public class News
{
	//消息类的标识属性
	@Id /* 用于修饰标识属性 */
	/* 指定该主键列的主键生成策略 */
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	//消息标题
	/* @Column指定该Field映射的列信息,此处指定了列名、长度 */
	@Column(name="news_title" , length=50)
	private String title;
	//消息内容
	@Transient
	private String content;
	//构造器
	public News()
	{
	}
	//标识属性的setter和getter方法
	public void setId(int id) 
	{
		this.id = id; 
	}
	public int getId()
	{
		return (this.id); 
	}
	//消息标题的setter方法和getter方法
	public void setTitle(String title) 
	{
		this.title = title; 
	}
	public String getTitle() 
	{
		return (this.title); 
	}
	//消息内容的setter方法和getter方法
	public void setContent(String content)
	{
		this.content = content; 
	}
	public String getContent()
	{
		return (this.content); 
	}
}

2.3 @Enumerated

有些情况下,实体的Field不是普通的java类型,而是枚举类型,只能接收几个固定的值,于是采用该注解修饰。

枚举类

public enum Season
{
	春季,夏季,秋季,冬季
}


@Entity
@Table(name="news_table")
public class News
{
	//消息类的标识属性
	@Id /* 用于修饰标识属性 */
	/* 指定该主键列的主键生成策略 */
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	@Enumerated(EnumType.ORDINAL)
	@Column(name="happen_season")
	private Season happenSeason;
		//happenSeason属性的setter和getter方法
	public void setHappenSeason(Season happenSeason)
	{
		this.happenSeason = happenSeason;
	}
	public Season getHappenSeason()
	{
		return this.happenSeason;
	}
}


2.4.@Lob、@Basic

有时数据库中需要保存图片,对于这种情况,可以采用Blob、Clob类型的数据保存

JPA使用@Lob Annotation来修饰这种大数据类型,当实体的Field为Byte[]或者Serializable类型时,@Lob修饰的Field将会映射为底层的Blob列;当实体Field为Char[]或者String类型时,将映射为Clob列

@Entity
@Table(name="person_table")
public class Person
{
	//实体类的标识属性
	@Id /* 用于修饰标识属性 */
	/* 指定该主键列的主键生成策略 */
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	/* @Column指定该Field映射的列信息,此处指定了列名、长度 */
	@Column(name="person_name" , length=50)
	private String name;
	@Lob
	private byte[] pic;

}


2.5.@Temporal

在java中表示日期、时间类型只有两种:Date和Calendar,但对于数据库有很多,例如date、time、datetime、timeStamp。在这种情况下,就不知如何映射到数据库了,因此可以采用该注解来说明映射到数据库的类型

@Entity
@Table(name="person_table")
public class Person
{
	//实体类的标识属性
	@Id /* 用于修饰标识属性 */
	/* 指定该主键列的主键生成策略 */
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	/* @Column指定该Field映射的列信息,此处指定了列名、长度 */
	@Column(name="person_name" , length=50)
	private String name;
	@Temporal(TemporalType.DATE)
	private Date birth;
}


2.6.将实体映射到多个表

在有些情况下,希望把一个实体分别映射到多个数据表中,此时不仅仅需哟啊Table来修饰实体,还要使用@SecondaryTable来修饰

@Entity
@Table(name="person_table")
/* 指定第二个表的表名为person_detail*/
@SecondaryTable(name="person_detail"
	, pkJoinColumns=@PrimaryKeyJoinColumn(name="person_id"))
public class Person
{
	//实体类的标识属性
	@Id /* 用于修饰标识属性 */
	/* 指定该主键列的主键生成策略 */
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	/* @Column指定该Field映射的列信息,此处指定了列名、长度 */
	@Column(name="person_name" , length=50)
	private String name;
	/* 指定将该列放入新数据表(person_detail)内 */
	@Column(table="person_detail", name="email")
	private String email;
	/* 指定将该列放入新数据表(person_detail)内 */
	@Column(table="person_detail", name="phone")
	private String phone;
	
}


上面这个例子就把这个实体分别放入到了数据库中的两张表中。


2.7.@Embedded

有些时候,实体属性不是基本数据类型,而是用户自定义的复合属性。这时候可以采用该关键字。

复合属性类

@Embeddable
public class Cat
{
	private String name;
	private String color;

	//无参数的构造器
	public Cat()
	{
	}
	//初始化全部属性的构造器
	public Cat(String name , String color)
	{
		this.name = name;
		this.color = color;
	}

	//name属性的setter和getter方法
	public void setName(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return this.name;
	}

	//color属性的setter和getter方法
	public void setColor(String color)
	{
		this.color = color;
	}
	public String getColor()
	{
		return this.color;
	}

}

映射类

@Entity
@Table(name="person_table")
public class Person
{
	//实体类的标识属性
	@Id /* 用于修饰标识属性 */
	/* 指定该主键列的主键生成策略 */
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	/* @Column指定该Field映射的列信息,此处指定了列名、长度 */
	@Column(name="person_name" , length=50)
	private String name;
	@Column(name="person_email")
	private String email;
	@Embedded
	@AttributeOverrides({
		@AttributeOverride(name="name" 
			, column=@Column(name="cat_name" , length=35)),
		@AttributeOverride(name="color" 
			, column=@Column(name="cat_color"))			
	})
	private Cat cat;	
}

这样的话,person_table表里面就会有Cat实体类的两个属性作为字段


 3.小结

本篇主要讲解了JPA中的基本属性的映射,主要是几个标签,理解就好。

版权声明:本文为博主原创文章,未经博主允许不得转载。

JPA实体基本映射

标签:

原文地址:http://blog.csdn.net/luckyzhoustar/article/details/47207005

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!