JPA实体基本映射

1.前言

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

2.JPA属性注入

2.1.常用注解

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

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

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

[email protected]

在默认情况下,实体类的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;
	}
}

[email protected]、@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;

}

[email protected]

在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"
	, [email protected](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;

}

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

[email protected]

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

复合属性类

@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"
			, [email protected](name="cat_name" , length=35)),
		@AttributeOverride(name="color"
			, [email protected](name="cat_color"))
	})
	private Cat cat;
}

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

 3.小结

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

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

时间: 2024-11-06 12:31:39

JPA实体基本映射的相关文章

JPA实体关联关系映射之概述

一.简介 首先来说关联关系是面向对象分析,面向对象设计最重要的部分,JPA是完全可以通过映射来简化数据持久化到数据,和Hibernate一样,JPA的关联关系也分为两种,一种是单向关联,一种是双向关联: 单向关联:只需要单向访问关联端,比如说:我们只能通过某一学期访问这学期的课程,而不能通过课程访问课程所属的学期,这种关联关系就是单向关联. 双向关联:关联的两端可以互相访问.比说说班级可以访问学生,学生也可以访问班级,这种关联关系就是双向关联. 关联关系可以分为如下几种: 单向:1-1:1-N;

JPA实体继承的映射

注:文章中据说的实体指的是被@Entity注解的类. JPA中对象关系映射通常情况下是一个实体对应一个表,两个实体之间没有任何关系.如果两个实体之间是继承关系,那么该如何映射呢? JPA中的实体支持继承映射,多态关联,多态查询.抽象类和具体的类都可以是实体,且都可以使用@Entity来注解,映射成实体,并查询封装成一个实体.实体类可以继承非实体类,非实体类也可以继承实体类. JPA的继承映射有如下几种情况: 一.实体类继承抽象(具体)实体类 抽象类可以指定成为一个实体,抽象实体和具体实体的唯一区

JPA总结——实体关系映射(一对多@OneToMany)

JPA总结——实体关系映射(一对多@OneToMany) 并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html 一对多模型(单向)说明:一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息.客户和地址是一对多的关系,并且客户与地址是单向关联的关系. 映射策略# 外键关联:两个表的关系定义在一个表中:# 表关联:两个表的关系单独定义一个表中通过一个中间表来关联.映射策略——外键关联 表结构如下: 1 TABLE custom

持久化API(JPA)系列(八)实体关系映射(ORM)之单表映射@EmbeddedId

接上文<持久化API(JPA)系列(七)实体关系映射(ORM)之单表映射@IdClass> 本文将介绍<联合主键:使用@EmbeddedId嵌入外部主键> 上文是通过@IdClass引用外部主键,联合主键也可以采用嵌入式主键替代. 1)新建外部主键类Family2.java 设置联合主键man和woman,因此外部主键也需要定义两个相同的变量,并添加一个以两个变量为输入的构造函数,同时添加getter/setter函数. 主键类必须满足: 1.必须实现Serializable接口,

持久化API(JPA)系列(六)实体关系映射(ORM)之映射类型

ORM实体关系映射,即将数据库中的数据表及表之间的关系,通过实体Bean及实体Bean之间的关系表现出来,实现通过操作实体Bean来操作数据库. ORM(Object-Relation-Map),其中Object表示实体Bean,Relation表示数据表,Map表示实体Bean与数据表的映射. 由于EJB3中的实体Bean采用JPA框架,因此这里的ORM就是指JPA映射.它的作用也类似于Hibernate.iBATIS.JDO.TopLink等持久化层框架中的实体关系映射. 根据表与表之间的关

JPA 实体映射

一.实体基本映射 1 /* 2 * @Entity:将领域对象标注为一个实体,表示保存到数据库中 3 * @@Table:保存到数据库中表名,默认表名为类名,可通过name属性命名 4 * 5 * */ 6 @Entity 7 @Table(name="t_user") 8 public class User { 9 10 11 @Id //主键 12 @GeneratedValue // JPA自动选择合适的生成策略 13 @Column(name="id_")

MySQL主键自动生成和生成器表以及JPA主键映射

MySQL主键自动生成 表设计 MySQL有许多主键生成策略,其中很常见的一种是自动生成.一般情况下,主键类型是BIGINT UNSIGNED,自动生成主键的关键词是AUTO_INCREMENT. CREATE TABLE Stock ( id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, NO VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, price DECIMAL(6,2) N

hibernate 实体关系映射笔记

@常用属性说明: @Entity:实体类 @Table:指定对应数据表 @Id:主键,使用可以为null值的类型,如果实体类没有保存到数据库是一个临时状态 @Column:配置普通属性,除了主键外,java基本类型的属性 @Base:普通属性的加载方式 @GeneratedValue:主键生成策略 @Temporal:日期类型(DATE,TIME还是TIMESTAMP),如果属性类型是java.util.Date(是以上3个类的父类)类型时才需要使用该@声明具体的日期类型 @Transient:

通过mybatis工具generatorConfig.xml自动生成实体,DAO,映射文件

简介 Mybatis属于半自动ORM,可以利用mybatis工具generatorConfig.xml自动生成DAO.实体.映射文件的方式来代替手动书写的方式,这样既提高了工作效率也可以在项目避免出现的一些细微难调试的BUG. 前提条件: 1.需要准备的第三方jar包为: mybatis-generator-core-1.3.2.jar和mysql-connector-java-5.1.39-bin.jar, 其中mybatis-generator-core-1.3.2.jar的下载地址为: h