欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JPA实体基本映射

程序员文章站 2022-04-23 12:05:44
...
               

 

 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=50private 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=50private 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=50private 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=50private 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]

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

复合属性类

@Embeddablepublic class Catprivate 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=50private 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