当前位置:首页>开发>正文

Hibernate中怎样实现类之间的关系 在Hibernate中,什么是对象-关系映射?

2024-01-11 11:45:30 互联网 未知 开发

 Hibernate中怎样实现类之间的关系 在Hibernate中,什么是对象-关系映射?

Hibernate中怎样实现类之间的关系

类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many。
  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

在Hibernate中,什么是对象-关系映射?

Hibernate是一款ORM框架,对JDBC进行了轻量级的对象封装。

简单来说,现在主流数据库,都是关系模型的。
但程序却是面对对象的。
hibernate 的作用就是让我们可以用面对对象的思想来操作关系型数据库。
简化了传统DAO层的代码量。并且更加符合面向对象原则。这就是对象-关系映射。
你可以把一个数据库表看作一个对象来操作它。表的字段可以看作对象的属性。

hibernate关系映射

你没有主外键的关联怎么建立对象之间的关系呢?比如说一对多映射Person与Address,采用many-to-one来映射,当你需要通过Person找到address的时候,hibernate会通过many-to-one来加载address,即发相应的sql语句。即通过many-to-one维护对象之间的关系。

如何理解hibernate关联关系

Hibernate的关联关系映射大概有这么几种:

1、单向N-
2、单向1-
3、单向1-N

4、单向N-N

5、双向1-N

6、双向N-N

7、双向1-
下面就对这七种关联关系映射进行一个简单的总结:

一、单向的多对一

看两个POJO

public class Person{

private int pid

private String name

private Address address

...//生成相应的getter、setter方法

}

----------------------------------------

public class Address{

private int id

private String detail

...//生成相应的getter、setter方法

}

这里我们需要维护的关系是多个Person可以对应同一个地址,使用单向的N-1映射我们只需要在多的一端加入一个外键指向一的一端即可

**看配置文件

...//部分字段配置省略 //关键配置

这样配置以后hibernate就会帮我们在多的一端(Person)添加一个外键addressId指向一的一端

二、单向的1-1(外键关联)

可以采用标签,指定多的一端的unique=true,这样就限制了多的一端的多重性唯一 通过这种手段映射一对一唯一外键关联 配置文件只需要修改为: 三、单向的1-N **看代码,我们知道一个班级有多名学生,这就是一个典型的1-N关系 public class Classes { private int id private String name private Set students ...//生成相应的getter、setter方法 } --------------------------------------------------------------------------- public class Student { private int id private String name ..//生成相应是getter、setter方法 } **映射原理:一对多关联映射,在多的一端添加一个外键指向一的一端,它维护的关系是一指向多 **配置文件: //在一的一端添加的外键指向多的一端(默认情况下市主键匹配) //注意它维护的是一指向多的关系 四、双向1-N 上面提到了单向的1-N在一的一端添加的外键指向多的一端即可,对于双向的1-N则类似于N-N,集合元素中不使用 元素映射关联属性,而使用元素,但是为了保证一的一端,因此需要增加unique="true"属性 **配置,简单修改单向1-N的配置文件 五、单向多对多 **先看两个POJO public class User { private int id private String name private Set roles ..//生成相应的getter、setter方法 } --------------------------------------------------------------------------- public class Role { private int id private String name ..//生成相应的getter、setter方法 } 现在需要映射这样的N-N关系,一个User可以有多个Role,而一个Role有可以被多个User所拥有 这样我们就可以将一个N-N关系拆分为两个N-1的关系 **看配置文件 这样我们的关系的明确了 t_user t_user_role t_role id name < -------userid roleid ----- > id name 六、双向的多对多关系 双向的多对多映射需要在两边都增加集合元素,用于映射集合属性 修改上面的单向N-N映射 在Role中添加集合属性 public class Role { private int id private String name privarte Set user ..//生成相应的getter、setter方法 } 修改配置文件 ------------------------------------------------------------------------------------------------ 注意点:1、双向多对多关联两边都需要指定连接表的表名和外键列的列名 2、两个集合元素Set的table值必须指定,而且需要相同 七、双向的一对一关联 双向的1-1关联有两种形式: 1、基于外键的双向1-1关联 我们可以回想一下上面提到的单向1-1映射,它是有N-1的一个特例,只需要在标签多的一端添加unique="true"属性就可以形成单向的1-1映射关系,那么该怎么样将这种映射改为双向的呢? 下面我们再举个例子:一个User必须要有一个唯一的identityId 首先创建两个POJO类 public class Person { private int id private String name private IdentityId identityId ..//生成相应的getter、setter方法 } public class IdentityId { private int id private String cardNo private Person person ..//生成相应的getter、setter方法 } **看配置文件 ----------------------------------------------------------------------------------- 注意:这里的property-ref属性为identity表明建立了从identity对象到person对象的关联. 因此只要调用identity持久化对象的getIdentityId()方法就可以导航到Person对象 由此可见: Person对象和IdentityId对象之间为双向的关联关系person.getIdentityId().getPerson() 2、基于主键的1-1双向关联 上面的POJO类不需要有任何变化,我们只需要修改配置文件 identityId 注意:这里的constrained="true"表明Person表的主键ID同时作为外键参考IdentityId表 -------------------------------------------------------------------------------------- 注意:这里Person表中ID既是主键同时还作为外键参照表IdentityId,因为使用了foreign标识符生成策略Hibernate就保证了Person 对象与关联的IdentityId对象共享一个主键 综上所述,hibernate的实体映射方式很灵活,如果我们使用hibernate映射得当将可以大大简化持久层数据的访问!

hibernate的关联关系映射

Hibernate的关联关系映射
1.单向关联:
a.多对一:
在子表中加入:


b.一对一:其实就是many-to-one的一种情况.唯一不同的就是关联中的外键字段具有唯一性约束.
在子表中加入:(unique="true")

或者
在主表加入:


c.一对多:
在主表中加入:





2.使用连接表的单向关联
a.一对多:通过制定unique="true",我们可以把多样性从多对多改变为一对多。
在主表中添加:





b.多对一:
在子表中添加:





c.一对一:
在子表中添加:





d.多对多:





3.双向连接:
a.一对多/多对一:
在子表中添加:(子表跟单向的完全相同)

在主表中添加:(主表比单向多一个inverse="true")





b.一对一:
基于外键关联:
在子表中添加:(子表跟单向的完全相同)

在主表中添加:(主表比单向不同的是constrained="true"改成property-ref="address")

或者
基于主键关联的:
在子表中添加:

在主表中添加:


4.使用连接表的双向关联:
a.一对多/多对一
在子表中添加:




在主表中添加:





b.一对一:
在子表中添加:




在主表中添加:





c.多对多:








hibernate关系映射和继承怎么实现?是怎么样的概念?

*1)父类和子类都有对应的表,使用定义继承关系,使用步骤如下 a.将父表和子表生成单表的基本映射 b.将子类添加extends父类 c.利用定义子类映射 从Hibernate3.0版本开始,可以将单独取出,放到一个hbm.xml中定义.格式如下 extends="父类类型" table="子类表"> //property字段映射 *2)父类和子类使用同一张数据表 选择题: 编号,题目,难度,选项,选择答案 简答题: 编号,题目,难度,简答答案 数据表Question 编号,题目,难度,选项,选择答案,简答答案,题目类型 使用定义子类映射,具体步骤: a.修改实体类,定义成父类和子类的结构 b.在映射文件中定义映射 //定义父类中属性的映射 discriminator-value="区分值"> //定义子类1中属性的映射 discriminator-value="区分值"> //定义子类2中属性的映射 以上是两种继承关系映射,注意一点配置的映射,对应两张表,两张实体类,两表的id应该是一一对应的,即同一个id代表的是一个实物,还有一但定义该映射,用hibernate查询时候 即使是 from 父类,获得的结果实际也是子类的一个list集合

在Hibernate中为什么需要进行关联映射?有哪几种关联映射。

关联映射就是将关系数据库中表的数据映射为java中的对象,以对象的形式表示,这样可以把对数据库的操作转化为对对象的操作。
Hibernate有7中映射关系:
1、单向一对一关联映射
2、 单向多对一关联映射(many-to-one)
3、 单向一对多关联映射(one-to-many)

4、 单向多对多映射(many-to-many)

5、 双向一对一关联映射

6、 双向一对多关联映射(非常重要)

7、 双向多对多关联映射

PS:以上也是我从网上搜的然后总结的,网上很多,自己搜一下,认真看看就知道了

java反射于hirbernate映射有什么不同

java反射是针对对像的反射,也就是说,你可以在运行时获得某一个对象属于哪个类,类中有哪些方法和属性,并可以获得他们,进行创建对象或者调用。

Hibernate的映射,是只ORM,对象关系映射,是一种持久层框架,提供数据库表与java对象之间的映射,比如要把一个表中的记录,变为java中的一个对象,那么这时候其实就用到了java的反射机制,动态调用newInstance方法来创建了对象。反过来通过ORM也可以把对象映射到数据库表中的某条记录。

总体来说:hibernate是一种映射机制,而java是反射,两种是不同的。
hibernate是对象与数据库表记录之间的映射,而java的反射机制,是针对java对象,进行动态调用的机制,各种框架,比如spring,struts就大量的使用了java反射。

这是我的个人使用经验,o(∩_∩)o...。

最新文章