关联映射:http://www.cnblogs.com/huxi/archive/2009/12/15/1624988.html
关联映射,hibernate查询方式:http://www.cnblogs.com/ablejava/p/5731018.html
一、Hibernate的加载流程
1.Hibernate配置文件的两种加载方式
①Configuration configuration = new Configuration();
configuration.configure();
public Configuration configure()throws HibernateException{
configure("/hibernate.cfg.xml");
return this;
}
②Configuration configuration = new Configuration();
configuration.configure(“”);
public Configuration configure(String resource)throws HibernateException{
log.info("configuring from resource:"+resource);
InputStream stream = getconfigurationInputStream(resource);
return doConfig(stream,resource);
}
二、crud操作
1.创建configuration对象加载Hibernate的配置文件(配置文件中包含领域类和表的映射资源文件)
2.通过configuration对象获得sessionfactory对象
3.打开session:sessionFactory.openSession();
4.用session进行查询
5.开启事务:session.beaginTransaction();进行curd操作。提交事务,并关闭session;
1 public void testSave{ 2 Configuration configuration = new Configuration(); 3 //加载类路径下的hibernate.cfg.xml 4 configuration.configure(); 5 //调用sessionFactory 6 SessionFactory sf = configuratiion.buildSessionFactory(); 7 //打开sessioin 8 Session s = sf.openSession(); 9 //开启事务 10 Transaction tr = s.beginTransaction(); 11 //进行保存操作 12 Object obj = new Object(); 13 obj.set(); 14 ......... 15 s.save(obj); 16 tr.commit(); 17 s.close()
三、关系操作
1.对象的状态
临时状态:new
持久化状态:get save update
脱管状态:clear close evict
2,关系操作
2.1 多对一和一对多单向关联映射
多对一
1 <hibernate-mappin> 2 <class name="bean.User" table="t_user"> 3 <id name="id"><generator class="native"/></id> 4 <property name="name"/> 5 <!-- 使用《many-to-one》映射多对一关系。导出ddl时将自动生成一个外键 --> 6 <many-to-one name="group" column="gid"/> 7 8 </class> 9 </hibernate-mappin> 10 <hibernate-mappin> 11 <class name="bean.Group" table="t_group"> 12 <id name="id"><generator class="native"/></id> 13 <property name="name"/> 14 </class> 15 </hibernate-mappin>
一对多
1 <hibernate-mapping> 2 <class name="bean.User" table="t_user"> 3 <id name="id"><generator class="native"/></id> 4 <property name="name"/> 5 </class> 6 </hibernate-mapping> 7 <hibernate-mapping> 8 <class name="bean.Group" table="t_group"> 9 <id name="id"><generator class="native"/></id> 10 <property name="name"/> 11 <!-- 使用set映射集合 --> 12 <set name="users"> 13 <!-- 使用《key》指定引用自身的外键表(t_user)中的外键 --> 14 <key column="gid"/> 15 <!-- 使用一对多的影视 --> 16 <one-to-many class="bean.User"/> 17 </set> 18 </class> 19 </hibernate-mapping>
2.2双向关联
<!-- bean/User.hbm.xml --> <hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"><generator class="native"/></id> <property name="name"/> <!-- 使用<many-to-one>映射多对一关系。导出ddl时将自动生成一个外键 --> <many-to-one name="group" column="gid"/> </class> </hibernate-mapping> <!-- bean/Group.hbm.xml --> <hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> <!-- 使用<set>映射集合 --> <set name="users"> <!-- 使用<key>指定引用至自身的外键表(t_user)中的外键 --> <key column="gid"/> <!-- 使用<one-to-many>映射一对多关系 --> <one-to-many class="bean.User"/> </set> </class> </hibernate-mapping>
双向关联中,为《set》加入“inverse=true”可以翻转维护关系:Hibernate将放弃从一的一端维护。user和group的关系必须使用user维护,操作group时Hibernate将不维护这个关系。
<set name="users" inverse=true>
操作group示例
sessiion.beginTransation(); User user = new User(); user.setName("bla"); Grop group = new Group(); group.setName("admin"); group.setUsers(new HashSet()); group.getUsers().add(user); session.save(user); session.save(group); session.getTransaction().commit(); //在一的一端翻转后,在多的一端进行维护 session.beginTransaction(); Group group = new Group(); group.setName("admin"); User user = new User(); user.setName("张三"); user.setGroup(group); session.save(group); session.save(user); session.getTransaction().commit()
2.3 一对一关联映射
依照映射方法不同,可分为主键关联映射和唯一外键关联映射。主键关联是维护两张表的主键一致,如有必要还可以在主键上再加上外键约束;唯一外键关联则类似于多对一关联,为表加入一个外键列,不过一对一关联会同时将这个外键加上唯一约束。
1、主键关联映射
主键单向关联
<!-- bean/User.hbm.xml --> <hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <!-- 指定主键生成策略为外键 --> <generator class="foreign"> <!-- 指定要参照的属性 --> <param name="property">group</param> </generator> </id> <property name="name"/> <!-- 使用<one-to-one>映射一对一关系。 --> <one-to-one name="group"> </class> </hibernate-mapping>
<!-- bean/Group.hbm.xml --> <hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> </class> </hibernate-mapping>
主键双向关联
<!-- bean/User.hbm.xml --> <hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <!-- 指定主键生成策略为外键 --> <generator class="foreign"> <!-- 指定要参照的属性 --> <param name="property">group</param> </generator> </id> <property name="name"/> <!-- 使用<one-to-one>映射一对一关系。 --> <one-to-one name="group"> </class> </hibernate-mapping>
<!-- bean/Group.hbm.xml --> <hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> <!-- 使用<one-to-one>映射一对一关系 --> <one-to-one name="user"/> </class> </hibernate-mapping>
2、唯一外键关联映射
单向
<!-- bean/User.hbm.xml --> <hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 为<many-to-one>加上unique就变成了一对一 --> <many-to-one name="group" unique="true" column="gid"/> </class>
<!-- bean/Group.hbm.xml --> <hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> </class> </hibernate-mapping>
双向
<!-- bean/User.hbm.xml --> <hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 为<many-to-one>加上unique就变成了一对一 --> <many-to-one name="group" unique="true" column="gid"/> </class> </hibernate-mapping>
<!-- bean/Group.hbm.xml --> <hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> <!-- 使用<one-to-one>映射一对一 --> <one-to-one name="user"/> </class> </hibernate-mapping>
2.4多对多关联
单向 关联
<hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 使用《set》映射集合,在多对多关系中,Hibernate将生成第三张表 --> <set name="groups" table="t_user_group"> <!-- 使用key指定引用至自身的外键表(t_user_group)中的外键 --> <key column="userid"></key> <!-- 使用many-to-one映射多对多关系,column指定另一端在表t_user_group中的列 --> <many-to-many class="bean.Group" colun="groupid"></many-to-many> </set> </class> </hibernate-mapping> <hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> </class> </hibernate-mapping>
双向关联
<!-- bean/User.hbm.xml --> <hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 使用<set>映射集合,在多对多关系中,Hibernate将生成第三张表 --> <set name="groups" table="t_user_group"> <!-- 使用<key>指定引用至自身的外键表(t_user_group)中的外键 --> <key column="userid"/> <!-- 使用<many-to-many>映射多对多关系,column指定另一端在表t_user_group中的列 --> <many-to-many class="bean.Group" column="groupid"/> </set> </class> </hibernate-mapping>
<!-- bean/Group.hbm.xml --> <hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 使用<set>映射集合,在多对多关系中,Hibernate将生成第三张表 --> <set name="users" table="t_user_group"> <!-- 使用<key>指定引用至自身的外键表(t_user_group)中的外键 --> <key column="group"/> <!-- 使用<many-to-many>映射多对多关系,column指定另一端在表t_user_group中的列 --> <many-to-many class="bean.User" column="userid"/> </set> </class> </hibernate-mapping>
多对多的双向关联同样可以在不想要维护关系的一端的<set>里设置inverse=”true”;但是必须有一端可以维护,也就是说只可以设置一个。
四、Hibernate的优点
五、hql语句