【JavaEE】经典JAVA EE企业应用实战-读书笔记15
来源:互联网 发布:圣火明尊盾牌进阶数据 编辑:程序博客网 时间:2024/06/06 00:33
对于一个JPA实体类而言,通常使用如下两个Annotation,@Entity和@Table
如果某个属性不希望被映射到数据库可以使用@Transient来修饰。
如果某个属性是枚举类型,则可以考虑使用@Enumerated来修饰,当value的属性是EnumType.STRING时,底层数据库保存枚举的名称。当value的属性是EnumType.ORDINAL时,底层数据库保存枚举的序号。
JPA支持大数据类型的值。使用@Lob来修饰这种类型,当实体的Field为byte[]、Byte[]或java.io.Serializabel类型时,@Lob将映射为底层的Blob列。当实体的Field为char[]、Character[]或java.lang.String类型时,@Lob将映射为底层的Clob列。
对于JPA加载Person实体时的Blob属性,我们可以让JPA不立即加载,只加载一个虚拟的代理,等到程序真正需要时才从数据库加载数据。JPA为这种机制提供了支持,并将其成为延迟加载。需要使用@Basic,指定如下属性
1)fetch:指定是否延迟加载,可接受FetchType.EAGER、FetchType.LAZY两个值,前者指定不使用延迟加载,后者指定使用延迟加载。
2)optional:指定该Field映射的数据列是否允许使用null值。
Java中日期只有java.util.Date和java.util.Calendar,但是对于数据库就有很多了,比如date、time、datetime、timestamp等。如何对应需要使用@Temporal来修饰Field。属性值TemporalType.DATE、TemporalType.TIME、TemporalType.TIMESTAMP三个。
如果需要将实体映射到多个表还要在class声明上使用@SecondaryTable,在Field的声明中@Column中指定table的属性值。
在@SecondaryTable中需要指定pkJoinColumns属性,指定一个或多个外键列,通过该外键列才可让新数据表中的记录参照到主表记录。其值是一个@PrimaryKeyJoinColum数组
在极端的情况下,可以把一个实体的状态存放到除主表外的多个表中,需要使用@SecondaryTables,他的作用仅仅是组合了多个@SecondaryTable
如果实体的属性不是简单类型,而是用户自定义的符合类型,则需要使用@Embedded来修饰。
@Entity@Table(name=”...”)public class Person{ ... @Embedded @AttributeOverrides( { @AttributeOverrid(name=”name”,column=@Column(name=”cat_name”,length=35)), @AttributeOverrid(name=”color”,column=@Column(name=”cat_color”)) })private Cat cat; ...}@Embeddablepublic class Cat{ private String name; private String color; //省略无参构造器 //省略有参数构造器 //省略set和get方法}在生成的数据表中,上面的那个cat会对应两个列
实体类的标识属性使用@Id修饰。如果希望JPA为逻辑主键自动生成主键值应该使用@GeneratedValue。属性如下
strategy:非必须,指定JPA对主键的生成策略。有四个
1)GenerationType.AUTO:由JPA自动选择
2)GenerationType.IDENTITY:对于MySQL、SQL Server选择自增长的主键生成策略
3)GenerationType.SEQUENCE:对于Oracle选择使用基于sequence的主键生成策略,应与@SequenceGenerator一起使用
4)GenerationType.TABLE:使用一个辅助表来生成主键。应与@TableGenerator一起使用。
generator:非必须,当使用GenerationType.SEQUENCE或GenerationType.TABLE时,该属性指定sequence、辅助表的名称
如果实体标识类型不是简单类型,而是用户自定义类型,则该类需要满足
1)类是public,至少一个public的无参数构造器
2)为每个属性提供set和get方法
3)类应该可以被序列化
4)需要重写equals和hashCode方法
public class Name implements java.io.Serializable{ private String first; private String last; //无参数构造器 //省略set和get //重写equals和hashCode}
@Entity@Table(name=”...”)@IdClass(Name.class)public class Person{ @Id private String first; @Id private String last;...}也可以
@Entity@Table(name=”...”)public class Person{ @EmbeddedId @AttributeOverrides( { @AttributeOverrid(name=”first”,column=@Column(name=”person_first”)), @AttributeOverrid(name=”last”,column=@Column(name=”person_last”,length=20)) } ) private Name name;}
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记15
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记1
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记2
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记3
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记4
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记5
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记6
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记7
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记8
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记9
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记10
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记11
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记12
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记13
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记14
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记16
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记18
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记19
- Android AsyncTask类
- List中对值的改变影响了另一个List的值
- Java1.8集合
- SQL中如何获取记录的排名
- Josephus问题(基于数组的实现)
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记15
- 关于input与IE8的一些事
- POJ 1054 The Troublesome Frog (枚举+优化)
- C语言小知识
- 输入银行卡号实现4位数出现一个空格
- mybatis 别名记录
- hive-sql to_unix_timestamp的用法
- Java properties属性文件中的值换行
- 【技巧】鼠标移入图片各种酷炫效果