




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一对一(One-To-One)使用OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体 通过外键关联到另一个实体的主键(注意要模拟一对一关联必须在外键列上添加唯一约束),(3).通过关联表来保存两个实体之间的连接关系(要模拟一对一关 联必须在每一个外键上添加唯一约束)。1.共享主键的一对一关联映射:EntityTable(name=Test_Body)public class Body private Integer id; private Heart heart; Id public Integer getId() return id; public void setId(Integer id) this.id = id; OneToOne PrimaryKeyJoinColumn public Heart getHeart() return heart; public void setHeart(Heart heart) this.heart = heart; EntityTable(name=Test_Heart)public class Heart private Integer id; Id public Integer getId() return id; public void setId(Integer id) this.id = id; 通过PrimaryKeyJoinColumn批注定义了一对一关联2.使用外键进行实体一对一关联:EntityTable(name=Test_Trousers)public class Trousers Id public Integer id; OneToOne JoinColumn(name = zip_id) public TrousersZip zip;EntityTable(name=Test_TrousersZip)public class TrousersZip Id public Integer id; OneToOne(mappedBy = zip) public Trousers trousers;上面的例子是指Trousers通过Trousers的外键列zip_id和TrousersZip关联,JoinColumn批注定义了联接 列,该批注和Column批注有点类似,但是多了一个名为referencedColumnName的参数。该参数定义了所关联目标实体中的联接列,注 意,当referencedColumnName关联到非主键列的时候,关联的目标类必须实现Serializable,还要注意的是所映像的属性对应单 个列(否则映射无效)一对一关联可能是双向的,在双向关联中,有且仅有一端作为主体(owner)端存在:主体端负责维护联接列(即更新),对于不需要维护这种关系的从 表则通过mappedNy属性进行声明。mappedBy的值指向主体的关联属性。例子中,mappedBy的值为zip。最后,不必也不能再在被关联端 (ownedside)定义联接列了,因为已经在主体端声明了。如果在主体没有声明JoinColumn,系统自动进行处理:在主表(owner table)中将创建联接列,列名为:主体的关联属性名+下划线+被关联端的主键列名。上面的例子中是zip_id,因为Trousers中的关联属性名 为zip,TrousersZip的主键是id。3.通过关联表定义一对一关联EntityTable(name=Test_People)public class People Id public Integer id; OneToOne JoinTable(name =TestPeoplePassports, joinColumns=JoinColumn(name=people_fk), inverseJoinColumns=JoinColumn(name=passport_fk) ) public Passport passport;EntityTable(name=Test_Passport)public class Passport Id public Integer id; OneToOne(mappedBy = passport) public People people;People通过名为TestPeoplePassports的关联表和Passport关联。该关联表拥有名为passport_fk的外键列, 该外键指向Passport表,该信息定义为inverseJoinColoumns的属性值,而people_fk外键列指向People表,该信息定 义为joinColumns的属性值。这种关联可能是双向的,在双向关联中,有且仅有一端作为主体(owner)端存在:主体端负责维护联接列(即更新),对于不需要维护这种关系的从表 则通过mappedNy属性进行声明。mappedBy的值指向主体的关联属性。例子中,mappedBy的值为passport。最后,不必也不能再在 被关联端(ownedside)定义联接列了,因为已经在主体端声明了。以上是一对一关联的三种形式,下面介绍多对一关联。多对一(Many-to-One)使用ManyToOne批注来实现多对一关联。ManyToOne批注有一个名为targetEntity的参数,该参数定义了目标实体名,通常不需要定义该参数,因为在大部分情况下默认值 (表示关联关系的属性类型)就可以很好的满足需求了。不过下面这种情况下这个参数就显得有意义了:使用接口作为返回值而不是常见的实体。ManyToOne(targetEntity=CompanyImpl.class)JoinColoumn(name=”COPM_ID”)Public Company getCompany() return company;多对一的配置方式有两种:(1)通过JoinColoumn映像(2)通过关联表的方式来映像(1) 通过JoinColoumn映射SRD Framework中Company,Category例子:Company:ManyToOne JoinColumn(name = CATEGORY_OPTION_ID) private Category category = null; Category:DiscriminatorValue(Category)public class Category extends Option (2) 通过关联表映射通过JoinTable批注定义关联表,该关联表包含了指回实体表的外键(通过JoinTable.joinColoumns)以及指向目标实体表的外键(通过JoinTable.inverseJoinColoumns)EntityTable(name=Test_TreeType)public class TreeType private Integer id; private String name; private ForestType forestType; ManyToOne(fetch = FetchType.LAZY) JoinTable(name=Test_Tree_Forest, joinColumns = JoinColumn(name=tree_id), inverseJoinColumns = JoinColumn(name=forest_id) )public ForestType getForestType() / forestType的getter,setter方法必须在这里,否则会出错 return forestType; public void setForestType(ForestType forestType) this.forestType = forestType; Id GeneratedValue public Integer getId() return id; public void setId(Integer id) this.id = id; public String getName() return name; public void setName(String name) = name; EntityTable(name=Test_ForestType)public class ForestType private Integer id; private String name; private Set trees; OneToMany(mappedBy=forestType)public Set getTrees() / trees的getter,setter方法必须在这里,否则会出错 return trees; public void setTrees(Set trees) this.trees = trees; Id GeneratedValue public Integer getId() return id; public void setId(Integer id) this.id = id; public String getName() return name; public void setName(String name) = name; 一对多(One-to-Many)使用OneToMany批注可定义一对多关联,一对多关联可以是双向关联。在EJB3规范中多对一这端几乎总是双向关联中的主体(owner)端,而一对多这端关联批注为OneToMany(mappedBy.)EntityPublic class Troop OneToMany(mappedBy=”troop”)Public Set getSoldiers().EntityPublic class Soldier ManyToOne JoinColumn(name=”troop_fk”)Public Troop getTroop().Troop通过troop属性和Soldier建立一对多的双向关联,在mappedBy端不必也不能再定义任何物理映射。对于一对多的双向映射,如果要一对多这一端维护关联关系,你需要删除mappedBy元素并将多对一这端的JoinColoumn的insertable和updatabel设置为false。这种方案不会得到什么明显的优化,而且还会增加一些附加的UPDATE语句。单向:通过在被拥有的实体端(owned entity)增加一个外键列来实现一对多单向关联是很少见的,也是不推荐的,建议通过一个联接表来实现这种关联(下面会讲到)。JoinColoumn批注来描述这种单向关联关系EntityPublic class Customer OneToManyJoinColoumn(name=”CUST_ID”)Public Set getTickets() .EntityPublic class Ticket .Customer通过CUST_ID列和Ticket建立了单向关联关系通过关联表处理单向关联:通过联接表处理单向一对多关联是首选方式,这种关联通过JoinTable批注进行描述EntityPublic class TrainerOneToManyJoinTable( name = TrainedMonkeys, jonColumns =JoinColumn(name= trainer_id), inverseJoinColumns = JoinColumn(name = monkey_id) )public Set getTrainedMonkeys() return trainedMonkeys; .Entitypublic class Monkey ./no bidir上面这个例子中,Trainer通过TrainedMonkeys表和Monkey建立了单向关联,其中外键trainer_id关联到Trainer(joinColoumn),而外键monkey_id关联到Monkey(inversejionColoumns)默认处理机制:通过联接表来建立单向一对多关联不需要描述任何物理映像,表名由以下三个部分组成:主表(ownertable)表名+从表(the other side table)表名,指向主表的外键名:主表表名+下划线+主表主键列名,指向从表的外键名:主表所对应实体的属性名+下划线+从表主键列名,指向从表的外键定义为唯一约束,用来表示一对多的关联关系。Entitypublic class Trainer OneToMany Public Set getTrainedTigers(). .Entitypublic class Tiger. ./no bidir上面这个例子中,Trainer和Tiger通过联接表Trainer_Tiger建立单向关联关系,其中外键trainer_id关联到Trainer,而外键trainedTigers_id关联到Tiger多对多(Many-to-Many)使用ManyToMany批注可定义多对多关联,同时,你也许要通过批注JoinTable描述关联表和关联条件。如果是双向关联,其中一段必须定义为Owner,另一端必须定义为inverse(在对关联表进行更新操作时这一端将被忽略)Entity()public class Employer implements Serializable private Integer id; private Collection employees; ManyToMany(targetEntity = org.hibernate.test.annotations.manytomany.Employee.class, cascade = CascadeType.PERSIST, CascadeType.MERGE ) JoinTable( name = EMPLOYER_EMPLOYEE, joinColumns =JoinColumn(name= EMPER_ID), inverseJoinColumns =JoinColumn(name= EMPEE_ID) ) public Collection getEmployees() return employees; .Entity()public class Employee implements Serializable ManyToMany( cascade = CascadeType.PERSIST, CascadeType.MERGE, mappedBy = employees targetEntity = Employer.class )public Collection getEmployers() return employers; . .JoinTable批注定义了联接表的表名,联接列数组,以及invers联接列数组,后者是关联表中关联到Employee主键的列(the “other side”)。被关联端不必也不能描述物理映射:只需要一个简单的mappedBy参数,该参数包含了主体端的属性名,这样就绑定了双方的关系。默认值:和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值, 关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+主表中的主键列名,关联到从表的外键名:主表中用于关联的属性名+下划线+ 从表的主键列名,以上规则对于双向一对多关联同样一样。关于mappedBy 双向关联是单向关联的扩展,只要一方写了配置(通常是 关联维护方即有外键的那方),另一方就可以通过 mappedBy 去找配置,不需要2边同时写. 关于JoinColumn JoinColumn(name=外键名字段名) 可以用来指定外键,双向关联里的外键是不需要写 private 和 get set 的.这个由hibernate自动维护.你表里设计了外键,但没用JoinColumn指定.hibernate会无视掉并以自己的命名方式想象一个外 键,假如你数据库里的外键和这个想象外键对不上,报错.也就是注意 JoinColumn(name=外键名字段名) 注解写在哪里的问题.如果外键是自己的.JoinColumn(name=外键名字段名)也写在自己这边,外键再写成成员变量就会报错. 怕漏写,总之外键的 private 和 get set 是没报错就当成员变量写上.报错了去掉就是了.关于 cascade 我大体是这么认为的.还有待验证.注意这个是数组,所以 cascade= .先简单说明下, A 类里有一个方法 getB() 用来获取 B 的对象假如 getB() 方法上写了 cascade 注解,说明 A 的更删之类的操作会影响数据表内B的数据.关联关系对这个没任何影响.总之就是A里获取B的方法上写上 cascade ,则 A 的操作就能影响数据库内具体的 B 数据.多对多关系映射是通过中间表来维护关联,这个由hibernate自动维护中间表,不要写 cascade .关于 fetch=FetchType.LAZY 我大体也是这么认为的.还有待验证. 先简单说明下, A 类里有一个方法 getB() 用来获取 B 的对象假如 getB() 方法上写了 fetch 注解,说明 A 类实体化后,除非使用 A.getB() 这个方法.否则不会立即从数据库里读取 B 的数据.fetch=FetchType.EAGER 是默认值,就是立即读取.假如要立即读取B的数据.不写 fetch 就是了. 关联关系对这个没任何影响.一对一关联OneToOne看下面的单双向一对多,多对多之后.一对一就更简单了.so.这里省过.一对多,多对一关联表字段说明 OneObject 表: one_id 主键ManyObject 表: many_id 主键one_id 外键,与OneObject 的主键关联单向一对多 OneObject: OneToManyJoinColumn(name=one_id) private Set mb = new HashSet();ManyObject: private int one_id; /这个就是和 JoinColumn(name=one_id) 对应的 one_id . 不需要注解.单向多对一 OneObject: 不需要注解.ManyObject: ManyToOneJoinColumn(name=one_id) /只需要在ManyObject指定外键为one_id.它就会去找 OneObject 的主键来对应. private OneObject one;双向一对多,双向多对一 OneObject: OneToMany(mappedBy=one) /告诉hibernate关联去找 one . private Set mb = new HashSet();ManyObject: ManyToOneJoinColumn(name=one_id) /注意,在这里指定外键名后,不要在 写 private int one_id; 和它的get set 方法了.这个改由hibernate维护.写上是要报错的. private OneObject one; /这个对应的就是 OneToMany(mappedBy=one) 的 on
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- sap考试试题及答案
- 电网基础知识培训课程课件
- 电缆颗粒生产基础知识培训课件
- 三洲田道路施工方案
- 安徽省亳州市蒙城县涡南片区联考2022-2023学年九年级上学期期中化学试题(含答案)
- 电站电工知识培训内容课件
- 电磁炉介绍与使用
- 北师大六上期中考试卷及答案
- 北京地理模拟中考试卷及答案
- 3-8-Diamino-6-phenylphenanthridine-生命科学试剂-MCE
- 街道综合执法培训课件
- 湘科版科学六年级上册全册教案(含反思)
- 小学科学教科版三年级下册全册思维导图(共24课)
- (三级)智能云服务交付工程师理论考试题库大全-中(多选题)
- 《色彩的对比》教学设计-1色彩的对比-五年级上册美术
- 浙江省中小学心理健康教育课程标准
- 4.4车体主要伤损形式及检修课件讲解
- 甲状腺术后出院健康宣教
- 《柔性棚洞防护结构技术规程》
- 2024年美国专利诉讼报告
- 施工现场临电方案
评论
0/150
提交评论