【JavaEE】经典JAVA EE企业应用实战-读书笔记15

来源:互联网 发布:圣火明尊盾牌进阶数据 编辑:程序博客网 时间:2024/06/06 00:33

对于一个JPA实体类而言,通常使用如下两个Annotation@Entity@Table

如果某个属性不希望被映射到数据库可以使用@Transient来修饰。

如果某个属性是枚举类型,则可以考虑使用@Enumerated来修饰,当value的属性是EnumType.STRING时,底层数据库保存枚举的名称。当value的属性是EnumType.ORDINAL时,底层数据库保存枚举的序号。

JPA支持大数据类型的值。使用@Lob来修饰这种类型,当实体的Fieldbyte[]Byte[]java.io.Serializabel类型时,@Lob将映射为底层的Blob列。当实体的Fieldchar[]Character[]java.lang.String类型时,@Lob将映射为底层的Clob列。

 

对于JPA加载Person实体时的Blob属性,我们可以让JPA不立即加载,只加载一个虚拟的代理,等到程序真正需要时才从数据库加载数据。JPA为这种机制提供了支持,并将其成为延迟加载。需要使用@Basic,指定如下属性

1)fetch:指定是否延迟加载,可接受FetchType.EAGERFetchType.LAZY两个值,前者指定不使用延迟加载,后者指定使用延迟加载。

2)optional:指定该Field映射的数据列是否允许使用null值。

 

Java中日期只有java.util.Datejava.util.Calendar,但是对于数据库就有很多了,比如datetimedatetimetimestamp等。如何对应需要使用@Temporal来修饰Field。属性值TemporalType.DATETemporalType.TIMETemporalType.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:对于MySQLSQL Server选择自增长的主键生成策略

3)GenerationType.SEQUENCE:对于Oracle选择使用基于sequence的主键生成策略,应与@SequenceGenerator一起使用

4)GenerationType.TABLE:使用一个辅助表来生成主键。应与@TableGenerator一起使用。

generator:非必须,当使用GenerationType.SEQUENCEGenerationType.TABLE时,该属性指定sequence、辅助表的名称

 

如果实体标识类型不是简单类型,而是用户自定义类型,则该类需要满足

1)类是public,至少一个public的无参数构造器

2)为每个属性提供setget方法

3)类应该可以被序列化

4)需要重写equalshashCode方法

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;}

0 0