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

JPA实体中字段映射补充和嵌入对象

程序员文章站 2022-04-23 15:55:46
...

实体中字段注解的说明

* @Column注解用于列映射,name元素用于指定所映射到的列的名称

* 实体字段的延迟提取: @Basic注解指定fatch元素,可以把基本映射的提取类型配置为延迟加载。

但是在实际中延迟加载简单类型的字段,不会带来多少资源的节省

JPA实体中字段映射补充和嵌入对象

* 大型对象

一个存储数据量很大的字符或者基于字节的对象,进行映射时候,需要特殊处理

@Lob注解标识某个字段是大对象,并且当LOB列的名称需要重写假定的默认名称时候,可以和@Column注解同时出现

数据库中存在两种LOB: 字符大型对象,称为CLOB,和二进制大型对象,称为BLOB

映射到BLOB列的java类型是:byte[]、Serializable[] ,而char[]、Character[]和String对象映射到CLOB列。

* 枚举类型的映射

枚举类型在Java中的值有一个隐式的序号,由声明它们的顺序所确定。此序号不能在运行时候修改,并且可以用来在数据

库中表示和存储改枚举类型的值。

JPA实体中字段映射补充和嵌入对象

在编译时候,指定给枚举类型的值的序号分别为FULL_TIME_EMPLOYEE为0 ,定义此类型的一个持久化字段

JPA实体中字段映射补充和嵌入对象

但是如果枚举类型发生变化,中间插入一个枚举类型,序号对应的值就会变化,这种情况不允许发生

解决:将值的名称存储为字符串,在特性上加上一个@Enumerated注解,并制定STRING的值

JPA实体中字段映射补充和嵌入对象

这种存放枚举类型方法,存在一个问题,如果枚举类型名修改了,也将导致数据受到影响。不过一般不会去改。

很是麻烦,还是直接使用字符串映射吧。

* 时间类型

java中时间类型: java.sql.Date、java.sql.Time和java.sql.Timestamp,java.util.Date,java.util.Calendar

java.sql的类型是完全无限制的,行为和简单映射处理一样。

但是对于java.util类型需要指明和JDBC驱动程序进行通信时,使用哪个java.sql类型,借助注解

@Temporal ,并且指定JDBC类型为TemporalType枚举类型的值(DATE,TIME,TIMESTAMP)

* 瞬态

对于持久化实体的一部分,但是不打算具有持久性的特性,可以加上瞬态修饰符transient或者@Transient注解

嵌入对象

嵌入对象依赖于一个实体确定其标识。它没有自己的标识,而仅仅是作为实体状态的一部分,被单独提取出来,存储在一个单独的java对象中,并且该对象附在实体之上。在java中,嵌入对象和关系类似,因为它们是有一个实体引用并作为关联目标出现。

简单的说,就是使用一个非实体的对象,作为实体的一个字段属性使用,在映射中,会将嵌入对象的字段,映射到数据库中

,减少一些公共字段的编码的感觉。

JPA实体中字段映射补充和嵌入对象

比如,employee表中,street,city,state,zip_code字段是address的,那么在定义employee实体的时候,只要引入

address嵌入对象的引用就可以了。

当然,嵌入对象必须使用@Embeddable注解标识,@Access访问的类型

@Embeddable
@Access(AccessType.FIELD)
public class Address {
	@Column(name="street")
	private String street;
	@Column(name="city")
	private String city;
	@Column(name="zip_code")
	private String zip;
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getZip() {
		return zip;
	}
	public void setZip(String zip) {
		this.zip = zip;
	}
}

,实体对象中使用加上注解@embedded

@Entity
@Table(name="employee")
public class Employee {
	@Id
	@Column(name="id")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	@Column(name="name")
	private String name;
	@Column(name="salary",columnDefinition="DECIMAL(10,2)")
	private BigDecimal salary;
	@Embedded
	private Address address;

如果,一个嵌入对象,两个实体,都需要使用,但是在另一个实体中映射的字段名不一样,此时就需要修改在另一个实体中嵌入对象映射的字段名称。

JPA实体中字段映射补充和嵌入对象

@Embedded
	@AttributeOverrides({
		@AttributeOverride(name="city",[email protected](name="city_1"))
	})
	private Address address;
name表示嵌入对象的字段名,column表示需要映射的表中字段名。


相关标签: JPA嵌入对象