JPA实体中字段映射补充和嵌入对象
实体中字段注解的说明
* @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",[email protected](name="city_1"))
})
private Address address;
name表示嵌入对象的字段名,column表示需要映射的表中字段名。上一篇: a标签的href值
推荐阅读