1.每一个持久化POJO类都是一个实体Bean,这可以通过在类的定义中是@Entity注解来进行声明:
2.定义表(Table),@Table是类一级的注解,通过@Table注解可以为实体bean映射指定表(table),如果没有定义@Table,那么系统自动使用默认值.
在@Table注解中,如果需要可以指定相应的值,结合使用@UniqueConstraint注解可以定义表的唯一约束
3.基本属性映射
实体bean中所有的非静态属性(static)和临时属性(Transient)属性都可以被持久化,除非将其注解为@Transient.所有没有定义注解的属性等价于在其上面添加了@Basic注解.通过@Basic注解可以声明属性的获取策略(fetch strategy):
对于简单属性来说.默认的获取方式是即时获取(early fetch).当一个实体Bean的实例被创建时,Hibernate会将这些属性的值从数据库中提取出来,保存到Bean的属性里.与即时获取相对应的是延迟获取(lazy fetch).如果一个属性的获取方式是延迟获取,Hibernate在创建一个实体Bean的实例时,不会即时将这个属性的值从数据库中读出.只有在该实体Bean的这个属性第一次被调用时,Hibernate才会去获取对应的值.通常不需要对简单属性设置延迟获取(lazy simple property),注意:千万不要和延迟关联获取(lazy association fetch)混淆了.为了实现延迟加载功能必须实现serializable接口.
4.列属性声明
使用@Column注解可将属性映射到列:
5.继承关联映射
JPA通过Inheritance annotation提供了几种继承策略[InheritanceType strategy:用来声明继承策略]:
InheritanceType.SINGLE_TABLE(缺省值)
⏹为类的继承体系采用同一个表
InheritanceType.JOINED
⏹为类继承体系中的每个类创建不同的表
InheritanceType .TABLE_PER_CLASS
⏹类继承体系中的每个类创建不同的表
6.从父类继承属性
通过一个父类共享一些公共属性,同时还不用将该父类作为映射的实体,这时可以使用@MappedSuperclass注解来进行映射
7.映射实体Bean的关联关系
8.关联关系从实体的数量上分为:
a)一对一,用@OneToOne注解
b)一对多,用@OneToMany注解
c)多对一,用@ManyToOne注解
d)多对多,用@ManyToMany注解
e)一对一(One-to-One)======>单项关联
以客户实体(CustomerEO)与地址实体(AddressEO)为例来说明如何映射一对一关系
映射
使用@OneToOne注解可以建立实体bean之间的一对一的关联.一对一关联有三种
情况:1.关联的实体共享同样的主键;2.其中一个实体通过外键关联到另一个实体的
主键;3.通过关联表来保存两个实体之间的连接关系(注意要模拟一对一关联必须在
外键列上添加唯一约束)
单向关联:
一个客户对应一个地址,通过客户可以获得该客户的地址信息.客户和地址是一对一的关系,但通过地址不能获得客户信息,客户和地址
f)一对一(One-to-One)=======>双向关联
以上配置的映射,只能通过实体Customer对象获得Address对象,是单向关联。若要使Address对象获得Customer对象,需要在Address中增加对Customer对象的引用
g)一对多(one-to-many)======>单项关联对于一对多的实体关系,表结构有两种设计策略,分别是外键关联和表关联
在JPA中,用@OneToMany来标识一对多的关系。实现一对多的单向关联,只需在代表一的实体(Author)中使用@OneToMany映射标注就可以了,代表多的实体不需要使用任何映射标注。
外键关联:两个表关系定义在其中的一个表中.
表关联:两个表的关系单独定义一个表中,通过一个中间表来关联.(表关联不可取) @OneToMany标记用于标注实体关系为一对多
h)一对多(one-to-many)======>双向关联
实体Company:公司。
实体Employee:雇员。
Company和Employee是一对多关系。那么在JPA中,如何表示一对多的双向关联呢?
JPA使用@OneToMany和@ManyToOne来标识一对多的双向关联。一端(Company)使用@OneToMany,多端(Employee)使用@ManyToOne。
在JPA规范中,一对多的双向关系由多端(Employee)来维护。就是说多端(Employee)为关系维护端,负责关系的增删改查。一端(Company)则为关系被维护端,不能维护关系。一端(Company)使用@OneToMany注释的mappedBy="company"属性表明Company是关系被维护端。
多端(Employee)使用@ManyToOne和@JoinColumn来注释属性company,@ManyToOne表明Employee是多端,@JoinColumn设置在employee表中的关联字段(外键)。
i)多对多(many-to-many)======>多对多关联
实体Player:玩家。
实体Game:游戏。
玩家和游戏是多对多的关系。一个玩家可以玩很多的游戏,一个游戏也可以被很多玩家玩。
JPA中使用@ManyToMany来注解多对多的关系,由一个关联表来维护。这个关联表的表名默认是:主表名+下划线+从表名。(主表是指关系维护端对应的表,从表指关系被维护端对应的表)。这个关联表只有两个外键字段,分别指向主表ID和从表ID。字段的名称默认为:主表名+下划线+主表中的主键列名,从表名+下划线+从表中的主键列名。
需要注意的:
1、多对多关系中一般不设置级联保存、级联删除、级联更新等操作。
2、可以随意指定一方为关系维护端,在这个例子中,我指定Player为关系维护端,所以生成的关联表名称为:player_game,关联表的字段为:player_id和game_id。
3、多对多关系的绑定由关系维护端来完成,即由Player.setGames(games)来绑定多对多的关系。关系被维护端不能绑定关系,即Game不能绑定关系。
4、多对多关系的解除由关系维护端来完成,即由Player.getGames().remove(game)来解除多对多的关系。关系被维护端不能解除关系,即Game不能解除关系。
5、如果Player和Game已经绑定了多对多的关系,那么不能直接删除Game,需要由Player解除关系后,才能删除Game。但是可以直接删除Player,因为Player是关系维护端,删除Player时,会先解除Player和Game的关系,再删除Player。
j)
9.