注解-关联关系.doc_第1页
注解-关联关系.doc_第2页
注解-关联关系.doc_第3页
注解-关联关系.doc_第4页
注解-关联关系.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

注解关联关系知识篇 标签: 注解 关联关系 CascadeType FetchType FetchMode 首先介绍cascade(CascadeType)、fetch(FetchType)、FetchMode、mappedBy、inverseJoinColumns等 注解属性。1, cascade 级联,用在ManyToOne、OneToMany、ManyToMany 情况下,cascade 的值只 能从 CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、cadeType.REFRESH(级联刷 新)、CascadeType.MERGE(级联更新)中选择一个或多个。还有一个更方便的选择是使用 CascadeType.ALL,表示选择上面全部四项.cascade=ALL等价于cascade=PERSIST, MERGE, REMOVE, REFRESH.。2, fetch 是否延迟加载,可选择项包括:FetchType.EAGER 和 FetchType.LAZY。前者表示关联关系的从类在主类加载的时候同时加载,后者表示关联关系的从类在自己被访问时才加载。默认FetchType.EAGER 非延迟加载,3, FetchMode 有三种模式,Fetch(FetchMode.JOIN) 会使用left join查询 只产生一条sql语句Fetch(FetchMode.SELECT) 会产生N+1条sql语句Fetch(FetchMode.SUBSELECT) 产生两条sql语句 第二条语句使用id in (.)查询出所有关联的数据4, mappedBy=xxx 通过这个属性来说明xxx是关系被维护端 5, inverseJoinColumns 被维护端外键的定义1) ManyToOne(fetch=FetchType,cascade=CascadeType) 可选 ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键 optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true fetch:表示抓取策略,默认为FetchType.EAGER cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合, 默认为无级联操作 targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity. 示例: /订单Order和用户User是一个ManyToOne的关系 /在Order类中定义 ManyToOne() JoinColumn(name=USER) public User getUser() return user; 2)JoinColumn 可选 JoinColumn和Column类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个ManyToOne的字段. name:该字段的名称.由于JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定. 例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键, 其默认的名称为实体User的名称+下划线+实体User的主键名称 示例:见ManyToOne 3)OneToMany(fetch=FetchType,cascade=CascadeType) 可选 OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段. fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存 cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新删除 还可以加OrderBy(XXX ASC)进行排序 例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除 示例: OneTyMany(cascade=ALL) public List getOrders() return orders; 4)OneToOne(fetch=FetchType,cascade=CascadeType) 可选 OneToOne描述一个一对一的关联 fetch:表示抓取策略,默认为FetchType.LAZY cascade:表示级联操作策略 示例: OneToOne(fetch=FetchType.LAZY) public Blog getBlog() return blog; 5)ManyToMany 可选 ManyToMany 描述一个多对多的关联.多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理 示例: User实体表示用户,Book实体表示书籍,为了描述用户收藏的书籍,可以在User和Book之间建立ManyToMany关联,User_Book中间表 Entity public class User private List books; ManyToMany(cascade = CascadeType.PERSIST, CascadeType.MERGE ,fetch = FetchType.EAGER) JoinTable(name=user_book,joinColumns = JoinColumn(name = user_id) , inverseJoinColumns = JoinColumn(name = book_id) ) Fetch(FetchMode.SUBSELECT)OrderBy(bookId) public List getBooks() return books; public void setBooks(List books) this.books=books; Entity public class Book private List users; ManyToMany(cascade=CascadeType.REFRESH,fetch = FetchType.EAGER,mappedBy=books) Fetch(FetchMode.SUBSELECT) public List getUsers() return users; public void setUsers(List users) this.users=users; 两个实体间相互关联的属性必须标记为ManyToMany, 需要注意的是,有且只有一个实体的ManyToMany注解需要指定mappedBy属性,指向targetEntity的集合属 性名称 接下来,在贴一下其它几个基本属性学习: 1、Entity(name=EntityName) 必须,name为可选,对应数据库中一的个表 2、Table(name=,catalog=,schema=) 可选,通常和Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息 name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名 catalog:可选,表示Catalog名称,默认为Catalog(). schema:可选,表示Schema名称,默认为Schema(). 3、id 必须 id定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.置于getXxxx()前.4、GeneratedValue(strategy=GenerationType,generator=) 可选 strategy:表示主键生成策略,有AUTO,INDENTITY,SEQUENCE 和 TABLE 4种,分别表示让ORM框架自动选择, 根据数据库的Identity字段生成,根据数据库表的Sequence字段生成,以有根据一个额外的表生成主键,默认为AUTO generator:表示主键生成器的名称,这个属性通常和ORM框架相关,例如,Hibernate可以指定uuid等主键生成方式. 示例: Id GeneratedValues(strategy=StrategyType.SEQUENCE) public int getPk() return pk; 5、Basic(fetch=FetchType,optional=true) 可选 Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法,默认即为Basic fetch: 表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER. optional:表示该属性是否允许为null,默认为true 示例: Basic(optional=false) public String getAddress() return address; 6、Transient 可选 Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性. 如果一个属性并非数据库表的字段映射,就务必将其标示为Transient,否则,ORM框架默认其注解为Basic 示例: /根据birth计算出age属性 Transient public int getAge() return getYear(new Date() - getYear(birth); 7、MappedSuperclass 可选 MappedSuperclass可以将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解 示例: MappedSuperclass public class Employee() . Entity public class Engineer extends Employee . Entity public class Manager extends Employee . 8、Embedded 可选 Embedded将几个字段组合成一个类,并作为整个Entity的一个属性. 例如User包括id,name,city

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论