表t_wifePk_idf_namePo对象publicclassWifePOprivateintid;privateStringname" />
文档库 最新最全的文档下载
当前位置:文档库 › Hibernate关联关系简单总结

Hibernate关联关系简单总结

Hibernate关联关系简单总结
Hibernate关联关系简单总结

一对一关系

主键关联(夫妻表)

表t_husband

pk_id f_name

po对象

public class HusbandPO

private int id;

private String name;

private WifePO myWife;

hibernate配置

cascade="all">

表t_wife

Pk_id f_name

Po对象

public class WifePO

private int id;

private String name;

private HusbandPO myMan;

hibernate配置

myMan

cascade="all">

唯一外键关联(表t_son,t_father)

表t_son

Pk_id f_name fk_father_id(外键)

表t_father

Pk_id f_name

Po对象

ublic class FatherPO

private int id;

private String name;

private SonPO mySon;

po对象public class SonPO

private int id;

private String name;

private FatherPO myDad;

Hibernate对应关系(FatherPO)

property-ref="myDad" cascade="all">

Hibernate对应关系(SonPO)

unique="true" cascade="all" column="fk_father_id">

一对多(单向双向关联)(母亲和孩子表)

t_mother表

pk_id f_name

t_child表

pk_id f_name fk_mother_id

po对象

public class MotherPO {

private int id;

private String name;

po对象

public class ChildPO {

private int id;

private String name;

private MotherPO mum;(填上这句就是一对多双向)

hibernate映射关系MotherPO

cascade="all">

hibernate映射关系ChildPO(单向)

hibernate映射关系ChildPO(双向)

cascade="all" column="fk_mother_id">

一对多单向和双向很类似,如果是双向只需要在孩子身上加上private MotherPO mum;在把孩子的hbm配置改成双向就可以了

多对多关系(一般做权限用,三张表,演员表t_role,角色表t_employee,关系表t_employee_role

po对象演员

public class EmployeePO {

private int id;

private String name;

private Set roleSet = new HashSet();

po对象角色

public class RolePO {

private int id;

private String name;

private Set employeeSet = new HashSet();

hibernate映射关系EmployeePO

column="fk_role_id"/>

hibernate映射关系RolePO

column="fk_employee_id"/>

继承关系一张表示例,宠物父类,子类cat,dog

表 t_pet

Pk_id f_name f_type f_fishnum f_bonenum (f_type代表类型相当于下面的discriminator-value="C"这个东西)

Po对象父类

public class PetPO {共有的属性

private int id;

private String name;

子类cat对象

public class CatPO extends PetPO {

private int fishNum;

子类dog对象

public class DogPO extends PetPO{

private int boneNum;

hibernate映射关系只需要一个PetPo.hbm.xml配置

type="int">

type="int">

Hibernate练习题

Hibernate&EJB考试试题 1、下面关于Hibernate说法正确的是()(选择两项) A)Hibernate是ORM的一种实现方式 B)Hibernate不要JDBC的支持 C)属于控制层 D)属于数据持久层 2、下面关于ORM的说法错误的是()(选择两项) A)对象关系映射,让现实中的对象同数据库的表产生映射(类与表产生映射) B)对象关系映射,让类同表产生关系 C)对象关系映射,让类同记录产生关系(类的实例与记录(表中的一行数据)产生关系) D)对象关系映射,让类中的属性同表中的列产生关系 3、下面关于Hibernate中Session的说法正确的是()(选择两项) A)Session是轻量级的,可以随意的创建和销毁 B)Session是重量级的,不能随意的创建和销毁 C)Session是线程安全的 D)Session不是线程安全的 4、在Hibernate中,以下()不属于session的方法 A、close() B. open() C. update() D. delete() 5、下面关于Hibernate中load和get方法说法正确的是() A)这两个方法是一样的,没有任何的区别 B)这两个方法不一样,load先找缓存,再找数据库

C)这两个方法不一样,get先找缓存,再找数据库 D)以上说法都不对 注:load()和get()都是先找缓存,再找数据库。 不同点是在检索时: load()是延迟检索,先返回代理对象,访问对象时在发出sql命令Get()是立即检索,直接发出sql命令,返回对象 6、在Hibernate中修改对象的说话错误的是() A)只能利用update方法来做修改 B)可以利用saveOrUpdate方法来做修改 C)可以利用HQL语句来做修改 D)不能利用HQL语句来修改 7、下面关于Hibernate中Transaction的使用说法正确的是()(选择两项) A)Transaction是可有可无的 B)Transaction在做查询的时候是可有可无的 C)Transaction在做修改的时候是可有可无的 D)Transaction在做修改的时候是必须的 8、使用Hibernate技术实现数据持久化时,下面()内容不在 Hibernate配置文件中配置(选择一项) A) 数据库连接信息 B) 数据库类型(dialect) C) show_sql参数 D) 数据库表和实体的映射信息

Hibernate HQL 语法 及相关的外键关联

Hibernate HQL 语法及相关的外键关联 例如对于TUser类 1.实体查询 String hql = " from User"; 执行这条语句会返回User以及User子类的纪录。 注: 如果 TUser 类具有外键, 查询结果不会报错,但结果中的外键为空值,访问就报空指针错误! 解决方法: select 别名.属性 from 类 as 别名. 没有别名.属性仍然报错! //此方法不一定能解决,但不会错. hql = "from https://www.wendangku.net/doc/3a143875.html,ng.Object" 会返回数据库中所有库表的纪录。 where 语句,as可以省略 hql = "from User as user where https://www.wendangku.net/doc/3a143875.html,='yyy'"; //https://www.wendangku.net/doc/3a143875.html,为类的属性 hql = "from User user where https://www.wendangku.net/doc/3a143875.html,='yyy'";

where子句中,我们可以通过比较运算符设定条件,如: =, <>, >, <, >=, <=, between XX and XX, not between, in (xx,xx), not in, is, like %XX% 等。 2.属性查询 (1)List list = session.createQuery("select https://www.wendangku.net/doc/3a143875.html,, user.age from User user").list(); 还可以在HQL中动态构造对象实例的方法,将数据封装。 (2)List list = session.createQuery("select new User(https://www.wendangku.net/doc/3a143875.html,, user.age) from TUser as user").list(); Iterator it = list.iterator(); while(it.hasNext() ) { User user = (User)it.next(); System.out.println(user.getName()); } 但是要注意这里的User对象只是对name和age属性的封装,其他状态均未赋值,所以不能用它来进行更新操作。 也可以在HQL的Select子句中使用统计函数 "select count(*) ,min(user.age) from User as user"

hibernate各种关联关系

一、多对一关联映射 会在多的一端加入一个外键,指向一的一端,这个外键是由 中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致 标签的定义示例: * 二、一对一主键关联 1、一对一主键关联单向 t_user id | name | groupid 1 | 菜10 | 1 2 | 容祖儿| 1 t_group id | name 1| 尚学堂 t_person id | name 1| 菜10 2| 容祖儿 t_idcard id | cardNo 1 | 8888888888 2 | 9999999999

hibernate 一对一主键关联映射(单向关联Person---->IdCard ) 一对一主键关联映射:让两个实体对象的id 保持相同,这样可以避免多余的字段被创建 具体映射: idCard 2、一对一主键关联双向 hibernate 一对一主键关联映射(双向关联Person<---->IdCard ) 需要在idcard 映射文件中加入标签指向person ,指示hibernate 如何加载person 默认根据主键加载 t_person id | name 3 | 菜10 4 | 容祖儿 t_idcard id | cardNo 1 | 8888888888 2 | 9999999999

Hibernate(V)——一对多与多对多关联关系映射(xml与注解)总结

Hibernate(6)——一对多和多对多关联关系映射(xml和注解)总结 涉及的知识点总结如下: ?One to Many 映射关系 o多对一单向外键关联(XML/Annotation) o一对多单向外键关联(XML/Annotation) o懒加载和积极加载 o一对多双向外键关联(XML/Annotation) ?Many to Many 映射关系 o多对多单向外键关联(XML/Annotation) o多对多双向外键关联(XML/Annotation) o set的inverse元素详解 ?问题小结 ?关联关系的优缺点 多对一单向外键关联关系 注意多对一关联是多方持有一方的引用。看一个例子,去淘宝购物,那么一个淘宝用户可以对应多个购物订单,如图所示: 多的一方是Orders,持有一方的引用,也就是Users,而在Users中无需作任何定义,从订单到用户的关系是单向多对一关联。对应数据库就是: 还有比如说学生和班级的关系,多个学生可以属于同一个班级,这就是从学生到班级也是典型的单向多对一关系,看代码实现: 基于注解的多对一单向外键关联: 单向多对一关联中,多方需要持有一方的引用,那么多方(学生类)需要额外配置,需要对持有的一方引用使用注解@ManyToOne (cascade={CascadeType.ALL}, fetch=FetchType.EAGER),设置为级联操作和饥渴的抓取策略,@JoinColumn(name="cid"),而一方(教室类)无需做任何多方的定义。 注意;多方必须保留一个不带参数的构造器! import ; import ; import ; //班级类,在多对一关系中属于一的方,不持有其他多余的配置,反而是被多方持有

Hibernate关联关系简单总结

一对一关系 主键关联(夫妻表) 表t_husband pk_id f_name po对象 public class HusbandPO private int id; private String name; private WifePO myWife; hibernate配置 表t_wife Pk_id f_name Po对象 public class WifePO private int id; private String name; private HusbandPO myMan; hibernate配置 myMan

Java应用数据库:Hibernate对多表关联查询

执行救济竞合的实务把握 周玉和彭长林所谓执行救济竞合,是指执行当事人、利害关系人或案外人,就具体执行案件的同一执行行为或执行标的,各自以不同的途径、方式及理由等提出异议,交由人民法院审查裁决的情形。慧眼辨析和准确把握执行救济竞合,对于及时、准确审查处理执行争议,提高执行效率,保护执行当事人、利害关系人、案外人合法权益具有积极意义。笔者现侧重从实务的角度,针对执行救济不同路径的竞合情形,就如何在实务中把握谈些心得。 执行实践中执行救济竞合情形,常见的有各不同主体的执行异议救济竞合、利害关系人程序异议与案外人实体异议竞合、消极执行与执行异议及执行监督救济竞合、执行异议与案外人异议及执行监督救济竞合四种情形。对执行救济竞合情形的不同处理,将在后续救济途径、救济时效、救济功能上产生不同的法律后果。因此,在司法实务中应当明晰梳辨、认真把握,针对不同情形作出不同处理。具体可从四个方面审查把关: 一、把好立案受理关 原则上对所有执行当事人、利害关系人、案外人的异议、执行复议、案外人异议之诉等,均应予以受理。但对同一主体就同一执行事项所提出的异议,则只能选择其中最恰当情形予以立案;如果当事人、利害关系人、案外人已行使异议权、复议权、申请更换执行法院权、诉权以资救济,则无必要启动执行监督立案程序。反之,则应当启动执行监督立案程序予以执行监督。 对于立案受理这一环节,还应注意:一是审查基本要件,防止恶意异议。基本要件包括异议主体身份资料,如公民个人的居民身份证或户口簿、法人的机构代码证等;异议书使用书面形式提出,并由异议人签名盖章;相应的基本证据材料,如执行法院的具体执行行为法律文

书、执行行为所违反的法律条文、对执行标的权属凭证或相应权利证明等。三个基本情况不能同时提供的,一般不予立案受理。二是审查提起异议、复议或诉讼期间。对执行异议要求在执行程序结束前提出;对执行程序已经结束的,不能再作执行异议立案。对所遭受的损害,异议人可通过提起损害赔偿之诉或返还不当得利之诉或者要求执行法院予以国家赔偿;对申请变更执行法院,只能向上一级法院提出,但需适度控制,一般限于被执行人有财产可供执行或有条件执行的案件,且需执行期间满六个月以上(这里的六个月应当剔除公告期间、鉴定评估、异议审查等期间;对裁定不服向上一级法院申请复议期间为十日内,执行当事人、案外人向执行法院提起的许可执行之诉、执行标的异议之诉、分配方案异议之诉,为收到裁定或通知之日起十五日内。 二、把好审查定性关 首先,对执行异议及复议,主要审查执行行为是否违反了法律规定和司法解释,即审查执行行为的合法性。执行行为的范围主要包括四个方面:执行法院采取的执行措施、强制执行时应当遵守的程序、强制执行中作出的某些法律文书(包括应发出而未发出相应的法律文书,应发出但发出了错误的法律文书,不应发出而发出了某种法律文书等等,如进行民事搜查时未出示搜查令等、其他侵害当事人、利害关系人合法权益的执行行为(如违法追加、变更被执行人等。上述情形往往相互交织在一起,难以截然分开。 还应当明确,对于新民事诉讼法所规定的对被执行人限制出境、在征信系统记录、在媒体公布不履行义务信息,应当作为一种执行行为对待,对其异议应按执行异议、复议程序审查。 其次,对案外人异议,主要审查案外人对执行标的物有无“所有权或者是其他阻止标的物转让、交付的权利”,即是否有足以排除强制执行的权利。这种权利不一定都是物权,主要包括所有权、用益物权、担保物权、占有、孳息收取权、债权、依法保全的标的物等。

hibernate关系映射注解配置

1. Hibernate Annotation关系映射有下面几种类型: 1)一对一外键关联映射(单向) 2)一对一外键关联映射(双向) 3)一对一主键关联映射(不重要,有需要看下文档即可) 在实际中很少用,使用注解@PrimaryKeyJoinColumn 意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用 注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML 映射可以生成。Annotation注解一对一主键关联映,有些bug。不过没空去研究它。 因为在实际开发中一对一很少用。在实际开发中我机会没有用过,主键关联就更少了 4)多对一关联映射(单向) 5)一对多关联映射(单向) 6)一对多关联映射(双向) 7)多对多关联映射(单向) 8)多对多关联映射(双向) 2.介绍各种映射用法 1)一对一外键关联映射(单向)Husband ---> Wife public class Husband{ private Wife wife; @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="wife_id",unique=true) public Wife getWife(){…} … } public class Wife{ } 一对一外键关联,使用@OneToOne,并设置了级联操作 @JoinColum设置了外键的名称为wife_id(数据库字段名),如果不设置,则默认为另一类的属性名+ _id 外键的值是唯一的(unique),不可重复,与另一类的主键一致 2)一对一外键关联映射(双向)Husband <---> Wife public class Husband{ private Wife wife; @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="wife_id",unique=true) public Wife getWife(){…} ... } public class Wife{ private Husband husband; @OneToOne(mappedBy="wife",cascade=CascadeType.ALL) public Husband getHusband(){…} ... } 一对一双向关联关系,使用@OneToOne 注意:需要加上mappedBy="wife",如果不加上的话,Wife也会生成一个外键(husband_id)。mappedby="wife"需要指向与他关联对象的一个属性(即Husband类里面的wife属性),这里的会在Husband表里面生成个外键wife_id字段,而Wife表里则不会生成。这里Husband作为维护端即主

利用轻量对象关系映射技术Hibernate提高开发效率

利用轻量对象关系映射技术Hibernate提高开发效率 Enhancing Development Efficiency with Hibernate a Lightweight Object/Relational Mapping Technology 谢挺 周维民 (上海大学机电工程与自动化学院,上海 200072) 摘 要 Hibernate是一种轻量对象关系映射技术。文章通过实例,介绍了Hibernate的一些关键特性,并阐述了该技术的一些局限性。 关键词 Hibernate 对象关系映射企业级JavaBeans 持久化 Abstract Hibernate is a lightweight Object/Relational Mapping(ORM) technology. Some key features of Hibernate are illustrated, and some limits of this technology are expounded. Keywords Hibernate Object/Relational Mapping (ORM) EJB Permanence 0 引言 随着internet的发展,应用服务程序已经从集中式、C/S模式过渡到B/S、分布式模式;无论是用户或是供应商都迫切希望缩短开发周期、提高开发效率,Hibernate应运而生。 1 Hibernate简介 Hibernate是一个面向Java环境的对象/关系数据库映射工具。对象/关系数据库映射(Object/Relational Mapping , ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型中去。 Hibernate不仅提高Java类到数据库的映射,还提供数据查询和获取数据的方法。Hibernate在英语中的意思是“冬眠”,顾名思义它使得商务逻辑的开发和数据库最大程度地分离,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。Hibernate的目标是解放开发者通常与数据持久化相关的编程任务的95%。对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是很有用的。 图1是Hibernate的体系结构图,从图中可以Array看到,系统为3层B/S模式,应用程序在客户端运 行将持久化的对象交由Hibernate。Hibernate通过 properties属性设置和XML Mapping实现商务逻 辑,调用和存储低层数据库后将返回的结果送给 客户端。 Hibernate对每一种数据库都有对应的 Dialect进行操作优化,从而提高它在各种情况 下的效率。目前,它的版本为3.0、支持的数据 库有Oracle、DB2、MySQL、PostgreSQL、Sybase,Interbase、Pointbase、Microsoft SQL Server、

hibernate关联注解

说明: 本文对hibernate的一对多、多对一、多对多的关联 示例代码是Order类和OrderItem类的一对多的关系 1.一对多 1.1注解方式: @OneToMany 代码示例如下: 双向关联,维护端在“多”的一端 Public class Order implements Serializable { Private Set orderItems = new HashSet(); @OneToMany(mappedBy="order"(有了mappedby不能也不该在此再定义@joincolumn),cascade = CascadeType.ALL, fetch = https://www.wendangku.net/doc/3a143875.html,ZY) @OrderBy(value= "id ASC") public Set getOrderItems() { return orderItems; } } 单向关联,维护端在此端 Public class Order implements Serializable { private Set orderItems = new HashSet(); @OneToMany(cascade = CascadeType.ALL, fetch = https://www.wendangku.net/doc/3a143875.html,ZY) @JoinColumn(name=”order_id”) @OrderBy(value= "id ASC") public Set getOrderItems() { return orderItems; } } 1.2维护端和级联问题 维护端的意思是对外键进行维护,维护端有对外键进行插入和更新的权利。 下面分情况介绍hibernate的级联操作: 1.2.1单向关联 对“一”表进行插入一条记录的操作: 1)级联类型:CascadeType.ALL 执行语句: 1.insert into category (description, name, id) values(?, ?, ?)

Hibernate一对多映射

hibernate一对多关联映射—单向 一、简述 一对多关联映射(one-to-many) 1、在对象模型中,一对多的关联关系,使用集合表示 比如Classes(班级)和Student(学生)之间是一对多的关系 public class Classes{ private String id; private String name; private Set students; } public class Student{ public String id; public String name; } 2、我们以前学过学生对班级是多对一,返过来,班级对学生就是一对多。 3、我们多对一的关系是用户和组。返过来看,从组这边来看,就是一对多了。 下面学生的示例是班级和学生。和用户和组是一样的。 一个班级有多个学生,这是一对多的关系;返过来,多个学生属于一个班级,这就是多对一了。 4、建立对象模型 5、这两个对象模型之间是有关系的。我们现在讲的是一对多。一的一端是班级。多的一端是学生。那么怎么样能体现出这种关系呢? 我们在学习多对一时,是在多的一端加上一个字段。这个字段做为外键关联一的一端。多对一,就是我们在看到学生的时候,能够知道这个学生是哪个班级的。或者是当我们看到用户的时候,知道这个用户是哪个组的。所以在用户里面持有组的引用。 6、那么一对多,就是一个组里面有多少个用户。所以要维护这种关系,必须在组里面持有用户的集合。 班级和学生也是一样的。一个班级有多少学生,所以在班级里面要持有相应的学生的集合。如下图 我们用Set,通常用户Set做映射。

箭头表示两者之间是有关系的。 7、上面的是对象模型,那么这种模型要映射成什么样呢? 当我们定义多对一的关系时,在加载多的一端时,能够把1的一端加载上来。因为两者之间是有关系的。 同理,一对多也是一样的,它要维护这种关系。这种关系就是一对多。一的一端要指向多。在维护这种关系时,在加载一的时候,就会把一的一端加载上来。 也就是说,在我在加载班级时,这个班级有多少个学生,它会把所有的学生自动查询上来,放到Set集合里面。这就是维护这个关系的目的。 8、我们知道,实体类要映射成表。所在下面画两个表。 依我们来看,是先有班级。再分配学生。 学生有了,班级有了。要保证知道一个班级有多少学生。 因为students这个集合是在Classes上,要映射它的时候,那么我们是要在t_classes表上加一个字段,然后将所有的学生用,表达式表达出来吗?可是这样做不符合数据库的设计范式。 9、所以说,这种关系的维护应该是在t_student这一端。也就是说,在t_student表中加一个字段,这个字段就是classesid。 也就是说,一对多关联映射,要把两个表的关联字段加到多的一端。 10、所以说,一对多与多对一的映射是一样的。没有区别。都在多的一端加一个外键,指向一的一端。 但是两者也是有区别的。区别就是关系。如果维护的是多对一,则加载多的时候,能把1加上来。如果维护的是一对多,则加载班级时,能把WHSD1011对应的两个学生加载上来。 我的理解:对于要相关联的表来说,如果一个表想要看到对方的表内容,则就要在自己的实体类中持有对方的引用。 如果只有一方看到另一方,就是单向的。 如果要双方都看到,就要在实体模型中彼此都持有对方的引用。

MyEclipse中hibernate反向工程实例(一对多关联)

MyEclipse中hibernate反向工程实例(一对多关联) 1、数据库设计 实例对象为工作人员和部门,关系为一个部门对应多个工作人员,一个工作人员只属于一个部门 见表语句如下:(先用Navicat建的表,然后导出的sql语句),数据库名称为test SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS`t_department`; CREATE TABLE`t_department`( `id`int(11)NOT NULL auto_increment, `departmentname`varchar(40)NOT NULL, `departmentlocation`varchar(100)NOT NULL, PRIMARY KEY(`id`) )ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS`t_user`; CREATE TABLE`t_user`( `id`int(11)NOT NULL auto_increment, `username`varchar(20)NOT NULL, `password`varchar(20)NOT NULL, `departmentid`int(11)NOT NULL, PRIMARY KEY(`id`), KEY`departmentid`(`departmentid`), CONSTRAINT`departmentid`FOREIGN KEY(`departmentid`)REFERENCES `t_department`(`id`) )ENGINE=InnoDB DEFAULT CHARSET=utf8; 2、使用MyEclipse反向工程生成配置文件和POJO类 第一步:配置数据源 1、打开MyEclipse,新建一个web工程,这里命名为hibernate_demo 2、打开数据库设置器:依次单击【window】-->【Show View】-->【Other…】如下图所示:

Hibernate 映射关联关系

Hibernate 映射关联关系 一、映射多对一关联关系。 1.单向的多对一 (1)以Customer 和Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户。从Order 到Customer 是多对一关联关系。 (2)创建Customer 和Order 表。 Create (3)用Intellij Idea 自动生成关联关系,以及对应的Entitiy.hbm.xml 和持久化类。 说明: 其中Type 是用来修饰对应的Attribute Name 的。 在Order 端,定义Customer 类,一个订单属于一个客户。而在Customer 端,一个客户可以有多个订单,因为是单向的,所以这里放弃属性的添加。 在Join Columns 定义了Order 和Customer 之间的关联关系,order 表中的customer_id 外键和customer 表中的customer_id 主键关联。 来看生成的Schema: 没有勾选customer_id,是因为Intellij Idea 没法直接映射为Customer 类型的customer。 Order.hbm.xml 使用 节点来维护多对一关联关系。 name 属性:多这一端关联的一那一端的属性的名称。 class 属性:关联的一端的属性的类型。 column 属性:一那一端在多的一端对应的数据表中的外键。可以任意命名,但需要和数据表中的字段对应。 (4)单向多对一的CRUD 以及需要注意的问题。 <1> 新增

①先保存一的一端Customer,后保存多的一端Order。 Save.java 打印SQL: Output 结论:发送了3条INSERT 语句。 ②先保存多的一端Order,再保存一的一端Customer。 Save2.java 打印SQL: Output2 结论:发送了3条INSERT 语句,2条UPDATE 语句。 总结:在单向多对一的关联关系下,先插入 1 的一端会减少SQL 语句的执行,性能更高。 <2>删除 先删除1的一端。 Delete.java 控制台打印: Cannot delete or update a parent row: a foreign key constraint fails (`hibernate`.`order`, CONSTRAINT `FK_m6q2ofkj1g5aobtb2p00ajpqg` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`)) 结论:在不设置级联关系的前提下,不能删除 1 的一端。 <3>更新 Update.java Output <4>查询 ①查询n 的一端,但是不使用查询出来关联的 1 的一端的对象。 @Test public void testMany2OneGet() { Order order = (Order) session.get(Order.class, 1); System.out.println(order.getCustomer().getClass().getName()); } 复制代码

hibernate映射关系学习笔记

对象关联关系 一对一 单向:一方引用,在引用方加入被引用对象字段,注解@OneToOne 默认引用外键字段名为“被引用类名_id”,使用@JoinColumn(name=”your_name”)更改外键字段名 联合主键: @JoinColumns({ @JoinColumn(name="add_id",referencedColumnName="id"), @JoinColumn(name="add_code",referencedColumnName="areaCode") }) 双向:双方各自引用,都加入对方的引用,注解@OneToOne,表之间各自外键引用,不符合设计要求,通常一方引用,所以在被引用方法注解: @OneToOne(MappedBy=”引用方字段名”)。双向一般都设MappedBy 组件映射:一对一关系通常处理为在同一张表中存储数据,若程序端需要拆分成多个实体,使用组件映射方式@Embeded(在包含实体中注解) 若需要属性重写(改列名): @AttributeOverrides({ @AttributeOverride(name="fname",column=@Column(name="firstname")), @AttributeOverride(name="lname",column=@Column(name="lastname")) }) 多对一和一对多 多对一单向:在多方有一方的引用,注解@ManyToOne 一对多单向:在一的一方存在多方的集合(set),在一方注解@OneToMany 注意,Hibernate将一对多处理为多对多的特例,默认为两个关系表建中间表关联,所以加@JoinColumn 双向:多方注解@ManyToOne,一方注解@OneToMany(mappedBy="st")(st为多方引用一方对象名),注意一方不需再注解@JoinColumn 多对多 单向:在其中一方引用另外一方,类型为集合(set),注解@ManyToMany,若要改变中间表的表名及列名, 注解@JoinTable(name,joinColumns={@JoinColumn(name=”table1_id”)}, reverseJoinColumns={@JoinColumn(name=””)}) 双向:

Hibernate之one-to-one主键关联映射

Hibernate之one-to-one主键关联映射one-to-one映射的例子为一个人拥有一个身份证,一个身份证属于一个人。 先创建po类 Person.java 1.package po; 2. 3.public class Person { 4.private int id; 5.private String name; //姓名 6.public int getId() { 7.return id; 8. } 9.public void setId(int id) { 10. this.id = id; 11. } 12. public String getName() { 13. return name; 14. } 15. public void setName(String name) { 16. https://www.wendangku.net/doc/3a143875.html, = name; 17. } 18. 19.} Card.java

1.package po; 2. 3.public class Card { 4.private int id; //身份证ID 5.private String number; //身份证号码 6.private Person person; //一个身份证号对应一个人 7. 8.public int getId() { 9.return id; 10. } 11. public void setId(int id) { 12. this.id = id; 13. } 14. public String getNumber() { 15. return number; 16. } 17. public void setNumber(String number) { 18. this.number = number; 19. } 20. public Person getPerson() { 21. return person; 22. } 23. public void setPerson(Person person) { 24. this.person = person; 25. } 26. 27. 28. 29. 30.}

Hibernate一对一映射配置详解

Hibernate一对一映射配置详解 雪飘寒 目录 Hibernate一对一映射配置详解 (1) 一、xml文件配置 (2) 1. 主键关联 (3) 2. 单方外键关联 (4) 3. 双方外键关联 (5) 二、注释方式配置(Annotation) (6) 1、主键关联 (6) 2. 单方外键关联 (7) 3. 双方外键关联 (8)

一对一关联分为主键关联与外键关联。 主键关联:不必加额外的字段,只是主表和辅表的主键相关联,即这两个主键的值是一样的。 外键关联:辅表有一个额外的字段和主表相关联,或者两个表都有额外的字段与对应表的相关联。一、xml文件配置 官方文档解释 (1) name: 属性的名字。 (2) class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。 (3) cascade(级联) (可选):表明操作是否从父对象级联到被关联的对象。 (4) constrained(约束) (可选):表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺序以及决定该关联能否被委托(也在schema export tool中被使用). (5) fetch (可选 - 默认设置为选择): 在外连接抓取或者序列选择抓取选择其一. (6) property-ref (可选):指定关联类的属性名,这个属性将会和本类的主键相对应。如果没有指定,会使用对方关联类的主键。 (7) access (可选 - 默认是 property): Hibernate用来访问属性的策略。 (8) formula (可选):绝大多数一对一的关联都指向其实体的主键。在一些少见的情况中,你可能会指向其他的一个或多个字段,或者是一个表达式,这些情况下,你可以用一个SQL公式来表示。(可以在org.hibernate.test.onetooneformula找到例子) (9) lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。lazy="false"指定此关联总是被预先抓取。注意,如果constrained="false", 不可能使用代理,Hibernate会采取预先抓取! (10) entity-name (可选): 被关联的类的实体名。

Hibernate 一级缓存及多表关联和操作缓存

Hibernate 一级缓存及多表关联和操作缓存 1.一级缓存 2.一级缓存快照的原理 3. 一级缓存的常用操作 (1)clear 清除一级缓存的所有对象 (2)evict 清除一级缓存的指定对象 (3)reflesh 重载,将数据库的数据同步到一级缓存 4.持久化对象的操作方法 (1)save() ( 2 ) update() (3)delete() (4)get() 和 load() 5.多表的操作(一对多) (1)保存 save()____级联 (2)删除 delete()___级联删除 三种状态转换图: 1.一级缓存 只发出一次sql语句

小结:缓存的作用,可以提高性能,减少数据库查询的频率。 2.一级缓存快照的原理 get 方式默认先去一级缓存查找,没找到结果再通过发出sql语句去数据库查找,找到 User 结果后,在内存堆中分配地址,如x00ff,同时为User 对象复制出一份快照,放到一级缓存中,一级缓存是map集合,User的地址x00ff就是key值,value 就是user对象的属性。 当要修改user的属性,刷出缓存时,Hibernate会自动拿引用的对象和快照进行比较,如果不一致,先更新缓存到新的数据,并发出sql update语句更新数据库,然后当同步成功之后,再自动内部同步快照。保证三者的一致性。 快照的主要作用:用来更新数据!当刷出缓存的时候,如果一级缓存和快照不一致,则更新数据库数据。 修改前,数据库的名字与要修改的不一致时,先会发出sql查询语句,再发出update 语句 数据库的名字与要修改的一致时,只会发出sql查询语句 数据库的名字与要修改的不一致时,先会发出sql查询语句,再发出update 语句

hibernate的继承映射(Inheritance Mapping)

继承映射(Inheritance Mapping) 10.1. 三种策略 10.1.1. 每个类分层结构一张表(Table per class hierarchy) 10.1.2. 每个子类一张表(Table per subclass) 10.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 10.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 10.1.5. 每个具体类一张表(Table per concrete class) 10.1.6. 每个具体类一张表,使用隐式多态 10.1.7. 隐式多态和其他继承映射混合使用 10.2. 限制 10.1. 三种策略 Hibernate 支持三种基本的继承映射策略: 每个类分层结构一张表(table per class hierarchy) table per subclass 每个具体类一张表(table per concrete class) 此外,Hibernate 还支持第四种稍有不同的多态映射策略: 隐式多态(implicit polymorphism) 对于同一个继承层次内的不同分支,可以采用不同的映射策略,然后用隐式多态来完成跨越整个层次的多态。但是在同一个 根元素下,Hibernate 不支持混合了元素 的映射。在同一个 元素下,可以混合使用“每个类分层结构一张表”(table per hierarchy)和“每个子类一张表”(table per subclass)这两种映射策略,这是通过结合元素 来实现的(见后)。 在多个映射文件中,可以直接在hibernate-mapping 根下定义subclass,union-subclass 和joined-subclass。也就是说,你可以仅加入一个新的映射文件来扩展类层次。你必须在subclass 的映射中指明extends 属性,给出一个之前定义的超类的名字。注意,在以前,这一功能对映射文件的顺序有严格的要求,从Hibernate 3 开始,使用extends 关键字的时侯,对映射文件的顺序不再有要求;但在每个映射文件里,超类必须在子类之前定义。 10.1.1. 每个类分层结构一张表(Table per class hierarchy)

相关文档
相关文档 最新文档