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;