JPA实体基本映射
1.前言
JPA可以使用XML映射文件来管理实体与数据表之间的映射关系,但在实际开发中,绝大部分情况都是采用Annotation来管理实体和数据表的映射关系。本篇着重来讲解一下JPA中采用注解形式来映射实体。
2.JPA属性注入
2.1.常用注解
@Entity:被该注解修饰的POJO就是一个实体
@Table:该注解反应的是所映射的一个表
@Column:该字段用来修饰多要描述的属性
在默认情况下,实体类的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;}
在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; }
上面这个例子就把这个实体分别放入到了数据库中的两张表中。
有些时候,实体属性不是基本数据类型,而是用户自定义的复合属性。这时候可以采用该关键字。
复合属性类
@Embeddablepublic 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中的基本属性的映射,主要是几个标签,理解就好。
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
下一篇: 西汉开国功臣中,卢绾是什么结局?
推荐阅读
-
netcore 2.2 使用 AutoMapper 实现实体之间映射
-
Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
-
关于springboot中的实体类无法映射数据库中不存在的字段
-
在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射
-
Spring data JPA 多表联合分页查询 自定义实体类
-
使用Java 8 Lambda表达式将实体映射到DTO的操作
-
浅析Go语言编程当中映射和方法的基本使用
-
Ef-Code-First 使用实体类映射出数据库
-
Spring JPA实体更新时自动补全字段值
-
Java Persistence API 实体映射的方向问题 JavaJPAORM