实体的基本映射
?
JPA的三大核心组件 ?EntityManager ,实体 和 JPQL
?
?
虽然JPA可以用XML映射来管理实体与数据表之间的映射关系 ,但实际开发中,用Annotation 比较多
?
对于一个JPA实体来说,通常用如下两个Annotation来修饰
?
?
@Entity:被该Annotation 修饰的POJO就是一个实体,可以指定一个name属性(实体名称),可以不指定默认该类名为实体名称
@Table:该Annotation指定实体所映射的表
?
@Table 的属性 ?
?
catalog
name
schema
uniqueConstraints ? 设置唯一约束
?
?
@Column为了指定某个属性所映射的数据列的详细信息,如,列名,列字段长等,用@Column修饰该属性
?
@Column属性
?
insertable
length
name
nullable
table
unique ?是否具有唯一约束
updatable?
?
?
@Transient ?修饰不想持久保持的Field
?
@Transient
private String content; ? //值不会保存到数据表中
?
@Enumerated 修饰枚举类型的Field
?
假设有一个season.java枚举类
?
public enum Season{spring,summer,autumn,winter}
?
?
@Eunmerated(EnumType.ORDINAL) ? ?//ordinal n.序数 ?,
//有两种格式 EnumType.STRING 存储的是枚举的值,
//EnumType.ORDINAL存储的枚举的序列号,1,2,3,,
@Column(name="season")
private Season happenSeason;
?
@LOB ?@Basic修饰大数据类型的Field
?
当实体的Field为byte[],Byte[]或者java.io.Serializable类型时 @Lob修饰的Field映射为底层的Bolb列
当实体的Field为char[],Character[],java.lang.String类型时,@Lob修饰的Field映射为底层的Clob列
?
?
@Lob
private byte[] pic;
?
?
保存pic的demo
?
File file = new File("img.png");
byte[] content = new byte[(int)file.length];
new FileInputStream(file).read(content);
person.setPic(content); ? // 前面 ,setTitle, setName ,一样 ?后面保存一样
?
?
比如我现在要查person的name,不想看Person的pic 怎么办呢,JPA提供延迟加载 @Basic 修饰
?
@Basic 的属性 ?1.fetch (FetchType.EAGER ? 不使用延迟加载;FetchType.LAZY 使用延迟加载)
2.optional ? 指定Field映射的数据列是否允许null值。
?
?修改Person 实体如下
?
private String name; ?// 这个以上的都不变
?
@Lob
@Basic(fetch=FetchType.LAZY)
private byte[] pic;
/////////////////////////////////////////////////////////////这样就OK?
?
@Temporal ?修饰日期类型的Field
?
java 日期时间类型有两种 java.util.Date, ? java.util.Calendar
?
数据库日期时间类型有 ? ?date, time ,datetime, timestamp
?
用Temporal 的value 属性 ?Temporal.DATE ? ? ??Temporal.TIME ? ? ?Temporal.TIMESTAMP?
?
分别对应数据的类型?
?
@Temporal(TemporalType.DATE)
private DATE birth;
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?