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中的基本属性的映射,主要是几个标签,理解就好。
版权声明:本文为博主原创文章,未经博主允许不得转载。