hibernate有几种映射关系 1.hibernate工作原理及为什么要用
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(外键关联)
可以采用
通过这种手段映射一对一唯一外键关联
配置文件只需要修改为:
三、单向的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,集合元素中不使用
元素映射关联属性,而使用
**配置,简单修改单向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的一个特例,只需要在
下面我们再举个例子:一个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映射得当将可以大大简化持久层数据的访问!
1.hibernate工作原理及为什么要用
一、工作原理
1. 通过Configuration().configure()读取并解析hibernate.cfg.xml配置文件
2. 由hibernate.cfg.xml中的
3. 通过config.buildSessionFactory()//创建SessionFactory
4. sessionFactory.openSession()//打开Sesssion
5. session.beginTransaction()//创建事务Transation
6. persistent operate持久化操作
7. session.getTransaction().commit()//提交事务
8. 关闭Session
9. 关闭SesstionFactory
二、为什么要用
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
Hibernate关系映射问题
基本上都比较常用,非说那个不常用的话一对一用得可能能少点,下面说下我的理解,我尽量说通俗点 我下面就举几个例子你就明白了: 1、一对一,比如一个表的字段有100多个,而且其中有40个其他表可能有用,那么你把这个表拆分成两个表,并且两个表中的数据都是一条记录对应一条记录,某一个表中存放另一个对应表的id用来维护两个记录之间的关系,因为本来这两条记录原来就是一条记录,不知道这么说你能明白吗? 2、一对多,如:部门表与用户表,一个部门是不是有多个用户,但是一个用户有且只有一个部门,很清晰了吧 3、多对一,相当于吧部门表与用户表打颠倒 4、多对多,其实就是一对多与多对一结合起来实现的关系,如用户表与权限表,一个用户有多个权限,而一个权限同时对应多个用户,两个结合起来就是多对多 5、单向双向只是hibernate的概念,比如你这两个表A---表B,这样通过表A来维护表B的数据,但是表B不能维护表A,这就是单项,双向现在应该就好解释了,通过两个表都可以相互管理对方的数据。书面点,单项就是由父类管理关联关系,子类无法管理,双向父类子类都可管理。 hibernate提出的这些关系都有相应的配置,其实这些关系在数据库中一直是存在的,只是hibernate对这些关系都通过不同的配置实现,单向和双向也有相应的配置,这些功能当然也可以不通过hibernate配置实现,自己在代码中维护这块关系也可以,单双向,数据库中没有类似相关概念,hibernate提出这块功能,我们可以通过配置完成他们的限制功能。想想如果我们代码只提供用户表管理部门表的功能,不给通过部门管理用户的方法,那么这是不是就类似于hibernate的单向概念呢? 时间有限就说这么多,都是自己在项目中的一些积累,可能有些地方理解不够深刻,包含包含
hibernate关系映射
你没有主外键的关联怎么建立对象之间的关系呢?比如说一对多映射Person与Address,采用many-to-one来映射,当你需要通过Person找到address的时候,hibernate会通过many-to-one来加载address,即发相应的sql语句。即通过many-to-one维护对象之间的关系。
hibernate 同一表映射多个类
Hibernate是允许一个类进行多次映射(但是要映射到不同的表),像你这种一张表对应不同的类,既然是不同的类,那么属性什么的肯定不一样,而Hibernate是通过反射机制根据配置文件把类中的属性与表的字段关联起来的。所以在查询简单属性的值的时候可能没问题,但是在查询其他与这个类关联起来的实例的时候可能会报空指针异常,主要你这么设计一张表对应不同的类,完全没有必要。