




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
叮嘣Hibernate Annotation使用hibernate Annotation来映射实体准备工作下载hibernate-distribution-3.3.2.GAhibernate-annotations-3.4.0.GAslf4j导入相关依赖包Hibernate HOME:hibernate3.jarlibbytecode(二进制)liboptional(可选的)librequired(必须的)导入required下的所有jar包antlr-2.7.6.jarcommons-collections-3.1.jardom4j-1.6.1.jarhibernate3.jarjavassist-3.9.0.GA.jarjta-1.1.jarslf4j-api-1.5.10.jarslf4j-log4j12-1.5.10.jarlog4j-1.2.14.jarmysql.jar-Annotation包ejb3-persistence.jarhibernate-annotations.jarhibernate-commons-annotations.jar简单的例子,通过annotation注解来映射实体PO1、 建立(Java Project)项目:hibernate_0100_annotation_HelloWorld_default2、 在项目根下建立lib目录a) 导入相关依赖jar包antlr-2.7.6.jarcommons-collections-3.1.jardom4j-1.6.1.jarejb3-persistence.jarhibernate-annotations.jarhibernate-commons-annotations.jarhibernate3.jarjavassist-3.9.0.GA.jarjta-1.1.jarlog4j-1.2.14.jarmysql.jarslf4j-api-1.5.10.jarslf4j-log4j12-1.5.10.jar3、 建立PO持久化类 cn.serup.model.Teacher 内容如下package cn.serup.model;import javax.persistence.Entity;import javax.persistence.Id;/Entity表示该是实体类Entitypublic class Teacher private int id ;private String username ;private String password ;/ID为主键,主键手动分配Idpublic int getId() return id;public void setId(int id) this.id = id;public String getUsername() return username;public void setUsername(String username) this.username = username;public String getPassword() return password;public void setPassword(String password) this.password = password;4、 在src目录中建立hibernate.cfg.xml(hibernate配置文件)文件,内容如下jdbc:mysql:/localhost/hibernaterootsabercom.mysql.jdbc.Driverorg.hibernate.dialect.MySQLDialecttruethread 5. 、建立新的源码包testa) 编写单元测试,结构如下cn.serup.hibernate.test.TeacherTest 内容如下:package cn.serup.hibernate.test;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.AnnotationConfiguration;import org.hibernate.tool.hbm2ddl.SchemaExport;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;import cn.serup.model.Teacher;public class TeacherTest private static SessionFactory sessionFactory ;Testpublic void testSaveTeacher() Teacher t = new Teacher() ;t.setId(2) ;t.setUsername(努尔哈赤) ;t.setPassword(12345) ;Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;session.save(t) ;session.beginTransaction().commit() ;BeforeClasspublic static void beforeClass() new SchemaExport(new AnnotationConfiguration().configure().create(true, true) ;sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory() ;AfterClasspublic static void afterClass() sessionFactory.close() ;Annotation表名称与字段映射,长度1、 项目:hibernate_0200_annotation_column2、 表名称映射,在默认情况下使用Entity,则使用类名做为表名3、 所有的注解写在get()方法上面4、 表名映射a) Table(name=t_teacher)3、 字段映射a) 默认情况下,则使用属性名称来作为列名(字段名)b) 在get()方法上写注解i. Column(name=t_username)ii. 长度iii. Column(name=t_username,length=35)c) 默认情况下会将所有的属性映射到表中,如果不想某个属性映射到表中,如下编写i. Transient(瞬时、临时(或者透明)Annotation映射主键属性(ID生成策略)1、 项目:hibernate_0300_annotation_ID2、 使用Id注解可以将实体bean中的某个属性定义为标识符(identifier),该属性的值可以通过应用自身进行设置(ID手动分配,但不能重复)3、 (EJB3规范)也可以通过Hiberante生成(推荐). 使用 GeneratedValue注解可以定义该标识符的生成策略: AUTO - 可以是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库. TABLE - 使用表保存id值 IDENTITY - identity column SEQUENCE - sequenceAUTO相当于XML映射文件中的Native4、AUTO ,写上GeneratedValue则会默认选择AUTO来生成主键,会根据你的方言来选择数据库提供的自增机制,作为主键的生产策略,如果数据库是MySQL,则使用auto_incrementIdGeneratedValue/或者GeneratedValue(strategy=GenerationType.AUTO)public int getId() . 5、IDENTITY 取得最大的ID值+1,作为主键IdGeneratedValue(strategy=GenerationType.IDENTITY)public int getId() . 6、TABLE 使用hilo(高低位算法,来产生主键)IdGeneratedValue(strategy=GenerationType.TABLE)public int getId() . 7、SEQUENCE Oracle的自增机制IdGeneratedValue(strategy=GenerationType.SEQUENCE)public int getId() . 使用Oracle的SEQUENCE 的话。他会自动建一张SEQUENCE 表,默认表名hibernate_sequence如果想改SEQUENCE 表名的话。如下编写SequenceGenerator(name=aa,sequenceName=teacherSEQ_DB)public class Teacher IdGeneratedValue(strategy=GenerationType.SEQUENCE,generator=aa)public int getId() . 说明:SequenceGenerator(name=aa,sequenceName=teacherSEQ_DB)Name为引用名称sequenceName为表名称GeneratedValue(strategy=GenerationType.SEQUENCE,generator=aa)使用类SEQUENCE为主键生成策略,更改表名,使用generator=aa引用类上定义好的aaAnnotation关系映射1、 一对一外键关联映射(单向)2、 一对一外键关联映射(双向)3、 一对一主键关联映射(不重要)在这不演示在实际中很少用,使用注解PrimaryKeyJoinColumn意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML映射可以生成。Annotation注解一对一主键关联映,有些bug。不过没空去研究它。因为在实际开发中一对一很少用。在实际开发中我机会没有用过,主键关联就更少了4、 多对一关联映射5、 一对多关联映射(单向)6、 一对多关联映射(双向)7、 多对多关联映射(单向)8、 多对多关联映射(双向)一对一外键关联映射(单向)1、 项目:hibernate_0400_annotation_one2one_fk_12、 建立POa) cn.serup.model.Bodyb) cn.serup.model.Heartpackage cn.serup.model;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.OneToOne;Entitypublic class Body private int id ;private String bodyName ;private Heart heart ;public String getBodyName() return bodyName;OneToOne(cascade=CascadeType.ALL)JoinColumn(name=bodyid,unique=true)/一对一外键关联,使用OneToOne,并设置了级联操作/JoinColum设置了外键的名称为bodyid如果不设置,则默认为heart_id/外键的值是唯一的(unique),不可重复,与Heart的主键一直public Heart getHeart() return heart;IdGeneratedValuepublic int getId() return id;public void setBodyName(String bodyName) this.bodyName = bodyName;public void setHeart(Heart heart) this.heart = heart;public void setId(int id) this.id = id;package cn.serup.model;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;Entitypublic class Heart private int id ;private String heartName ;IdGeneratedValuepublic int getId() return id;public void setId(int id) this.id = id;public String getHeartName() return heartName;public void setHeartName(String heartName) this.heartName = heartName;编写单元测试cn.serup.hibernate.test.One2One_1package cn.serup.hibernate.test;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.AnnotationConfiguration;import org.hibernate.tool.hbm2ddl.SchemaExport;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;import cn.serup.model.Body;import cn.serup.model.Heart;public class One2One_1 private static SessionFactory sessionFactory ;Testpublic void testSaveTeacher() Heart h = new Heart() ;h.setHeartName(h2) ;Body b = new Body() ;b.setBodyName(b2) ;b.setHeart(h) ; Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;session.save(h) ;session.save(b) ;session.beginTransaction().commit() ;Testpublic void testLoadOne2One() Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;Body b = (Body) session.get(Body.class, 1) ;System.out.println(b.getId() + +b.getBodyName();Heart h = b.getHeart() ;System.out.println(h.getId() + +h.getHeartName();session.beginTransaction().commit() ;Testpublic void testDeleteOne2One() Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;Body b = (Body) session.get(Body.class, 1) ;session.delete(b) ;session.beginTransaction().commit() ;BeforeClasspublic static void beforeClass() new SchemaExport(new AnnotationConfiguration().configure().create(true, true) ;sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory() ;AfterClasspublic static void afterClass() sessionFactory.close() ;一对一双向关联关系:hibernate_0500_annotation_one2one_fk_2改动Heart对象package cn.serup.model;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.OneToOne;Entitypublic class Heart private int id ;private String heartName ;private Body body ;OneToOne(mappedBy=heart,cascade=CascadeType.ALL)/一对一双向关联关系,使用OneToOne/注意:需要加上mappedBy=heart,如果不加上的话,/Heart也会生成一个外键(body_id)/mapped=heart需要指向与他关联对象的一个属性/说明双向关联关系中,有且仅有一端是作为主体(owner)端存在的/主体端负责维护联接列/对于不需要维护这种关系的从表则通过mappedBy属性进行声明/mappedBy的值指向主体的关联属性/规律:只有是双向关联关系,都加上mapped /cascade=CascadeType.ALL级联public Body getBody() return body;public void setBody(Body body) this.body = body;IdGeneratedValuepublic int getId() return id;public void setId(int id) this.id = id;public String getHeartName() return heartName;public void setHeartName(String heartName) this.heartName = heartName;测试,从Heart中加载BodyTestpublic void testLoadOne2One() Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;Heart h = (Heart) session.load(Heart.class, 1) ;System.out.println(h.getId() + +h.getHeartName();Body b = h.getBody() ;System.out.println(b.getId()+ +b.getBodyName();session.beginTransaction().commit() ;多对一关联映射1、 项目:hibernate_0700_annotation_many2one2、 建立POa) cn.serup.model.Organizationb) cn.serup.model.Companyc) 多个公司对应一个组织机构package cn.serup.model;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;Entitypublic class Organization private int id ;private String orgName ;public String getOrgName() return orgName;public void setOrgName(String orgName) Name = orgName;IdGeneratedValuepublic int getId() return id;public void setId(int id) this.id = id;package cn.serup.model;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;Entitypublic class Company private int id ;private String compayName ;private Organization org ;IdGeneratedValuepublic int getId() return id;public void setId(int id) this.id = id;public String getCompayName() return compayName;public void setCompayName(String compayName) payName = compayName;ManyToOne(targetEntity=Organization.class)JoinColumn(name=orgid)/多对一注解ManyToOne/targetEntity指定了关联对象/JoinColumn(name=orgid)指定生产的外键的字段名,默认是org_idpublic Organization getOrg() return org;public void setOrg(Organization org) = org;单元测试package cn.serup.hibernate.test;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.AnnotationConfiguration;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;import cn.serup.model.Organization;import cn.serup.model.Company;public class Many2One private static SessionFactory sessionFactory ;Testpublic void testSaveOne2One() Organization o = new Organization() ;o.setOrgName(谷度培训机构) ;Company c = new Company() ;c.setCompayName(广州分公司) ;c.setOrg(o) ;Company c1 = new Company() ;c1.setCompayName(成都分公司) ;c1.setOrg(o) ;Company c2 = new Company() ;c2.setCompayName(天津分公司) ;c2.setOrg(o) ;Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;session.save(o) ;session.save(c) ;session.save(c1) ;session.save(c2) ;session.beginTransaction().commit() ;Testpublic void testLoadOne2One() Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;Company c = (Company)session.load(Company.class,1) ;System.out.println(c.getCompayName()+org:+c.getOrg().getOrgName();session.beginTransaction().commit() ;Testpublic void testDeleteOne2One() Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;Company c = (Company) session.load(Company.class, 1) ;session.delete(c) ;session.beginTransaction().commit() ;BeforeClasspublic static void beforeClass() /new SchemaExport(new AnnotationConfiguration().configure()/.create(true, true) ;sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory() ;AfterClasspublic static void afterClass() sessionFactory.close() ;一对多关联映射(单向)1、 项目:hibernate_0800_annotation_one2many_12、 建立POa) cn.serup.model.Organizationb) cn.serup.model.Companypackage cn.serup.model;import java.util.Set;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.OneToMany;Entitypublic class Organization private int id ;private String orgName ;private Set company ;OneToManyJoinColumn(name=orgid)/* * 一对多注解OneToMany(单向) * 如果只写OneToMany的话,hibernate会建一张中间表来 * 维护他们之间的关系, * 加上JoinColumn(name=orgid),则不会建中间表,他会在 * 多的一端加上外键orgid,来维护他们之间的关系 */public Set getCompany() return company;IdGeneratedValuepublic int getId() return id;public String getOrgName() return orgName;public void setCompany(Set company) pany = company;public void setId(int id) this.id = id;public void setOrgName(String orgName) Name = orgName;package cn.serup.model;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;Entitypublic class Company private int id ;private String compayName ;IdGeneratedValuepublic int getId() return id;public void setId(int id) this.id = id;public String getCompayName() return compayName;public void setCompayName(String compayName) payName = compayName;编写单元测试package cn.serup.hibernate.test;import java.util.HashSet;import java.util.Iterator;import java.util.Set;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.AnnotationConfiguration;import org.hibernate.tool.hbm2ddl.SchemaExport;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;import cn.serup.model.Company;import cn.serup.model.Organization;public class Many2One private static SessionFactory sessionFactory ;SuppressWarnings(unchecked)Testpublic void testSaveOne2One() Organization o = new Organization() ;o.setOrgName(谷度培训机构) ;Company c = new Company() ;c.setCompayName(广州分公司) ;Company c1 = new Company() ;c1.setCompayName(成都分公司) ;Company c2 = new Company() ;c2.setCompayName(天津分公司) ;Set set = new HashSet() ;set.add(c) ;set.add(c1) ;set.add(c2) ;o.setCompany(set) ; Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;session.save(o) ;session.save(c) ;session.save(c1) ;session.save(c2) ;session.beginTransaction().commit() ;SuppressWarnings(unchecked)Testpublic void testLoadOne2One() Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;Organization o = (Organization)session.load(Organization.class, 1) ;System.out.println(o.getId()+ +o.getOrgName() ;Set list = o.getCompany() ;for(Iterator it = list.iterator(); it.hasNext();) Company c = (Company)it.next() ;System.out.println(c.getId()+ +c.getCompayName();session.beginTransaction().commit() ;Testpublic void testDeleteOne2One() Session session = sessionFactory.getCurrentSession() ;session.beginTransaction() ;/Company c = (Company) session.load(Company.class, 1) ;/session.delete(c) ;session.beginTransaction().commit() ;BeforeClasspublic static void beforeClass() new SchemaExport(new AnnotationConfiguration().configure().create(true, true) ;sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory() ;AfterClasspubl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2025年标准)股权担保协议书
- 2025年银行招聘柜员考试模拟题和答案详解
- 2026届河北省唐山市路南区唐山一中高一化学第一学期期末复习检测模拟试题含解析
- (2025年标准)购买竹子协议书
- (2025年标准)购房责任协议书
- 脑水肿药物创新-洞察及研究
- 智能家居设计国际趋势-洞察及研究
- 鸟巢抗风稳定性分析-洞察及研究
- 跨境投资法律合规-洞察及研究
- 2025年工程吊装付款协议书
- 陈腐垃圾施工方案
- 渤海大学《软件工程》2022-2023学年第一学期期末试卷
- 税务会计岗位招聘笔试题及解答(某大型国企)2024年
- ICD-10疾病编码完整版
- 消防设备设施操作讲解培训讲课文档
- 内分泌科医疗管理制度
- 临床开展十二项细胞因子检测临床意义
- FlowmasterV7中文技术手册
- 房屋承包出租合同
- 石油化学工业的发展历程与前景
- 《滚珠丝杠螺母副》课件
评论
0/150
提交评论