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

本文详细介绍了JPA实体字段的映射,包括@Column注解的使用,延迟加载的基本映射,@Lob注解处理大型对象,如BLOB和CLOB的映射。此外,还讲解了枚举类型、时间类型的映射策略以及如何使用@Temporal注解。对于瞬态字段,使用transient关键字或@Transient注解。最后,探讨了嵌入对象的概念,如何通过@Embeddable和@Embedded注解实现对象的嵌入映射,以提高代码复用和简化数据库设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实体中字段注解的说明

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

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

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


* 大型对象

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

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

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

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

* 枚举类型的映射

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

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


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


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

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


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

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

* 时间类型

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中,嵌入对象和关系类似,因为它们是有一个实体引用并作为关联目标出现。

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

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


比如,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;

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


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值