hql语句:hibernate提供的面向对象的查询语句,使用对象(类)和属性进行查询,区分大小写。 获得Query对象:Query query = session.createQuery(“hql”) 这里我们需要维护的关系是多个Person可以对应同一个地址,使用单向的多对一,映射我们只需要在多的一端加入一个外键指向一的一端即可 这样配置以后hibernate就会帮我们在多的一端(Person)添加一个外键addressId指向一的一端; 映射原理:一对多关联映射,在多的一端添加一个外键指向一的一端,它维护的关系是一指向多 现在需要映射这样的多对多关系,一个User可以有多个Role,而一个Role有可以被多个User所拥有 这样我们的关系的明确了 注意:这里的property-ref属性为identity表明建立了从identity对象到person对象的关联. 注意:这里的constrained=”true”表明Person表的主键ID同时作为外键参考IdentityId表 注意:这里Person表中ID既是主键同时还作为外键参照表IdentityId,因为使用了foreign标识符生成策略Hibernate就保证了Person (未完待续…)
Hibernate基础总结
整体结构
一、Hibernate相关的API
事务提交:tx.commit();
事务回滚:tx.rollback();
Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.gt("age", new Integer(20))); criteria.add(Restrictions.lt("age", new Integer(40))); List users = criteria.list();
二、集合属性
因为经过Session操作后,集合就变成了Hibernate自己的集合实现类。三、关联关系
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方法 }
<class name="Person"> <id name="id"> <generator class="native"/> </id> ...//部分字段配置省略 <many-to-one name="address" column="addressId"/>//关键配置 </class>
2. 单向多对一单向一对多
看代码,我们知道一个班级有多名学生,这就是一个典型的一对多关系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方法 }
<class name="Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students"> <key column="classesid"/>//在一的一端添加的外键指向多的一端(默认情况下市主键匹配) <one-to-many class="xxx.Student"/>//注意它维护的是一指向多的关系 </set> </class>
可以采用标签,指定多的一端的unique=true,这样就限制了多的一端的多重性唯一;
通过这种手段映射一对一唯一外键关联,配置文件只需要修改为:<many-to-one name="address" column="addressId" unique="true"/>
先看两个POJOpublic class User { private int id; private String name; private Set roles; ..//生成相应的getter、setter方法 }
public class Role { private int id; private String name; ..//生成相应的getter、setter方法 }
这样我们就可以将一个多对多关系拆分为两个多对一的关系<class name="xxx.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="userid"/> <many-to-many class="xxx.Role" column="roleid"/> </set> </class>
t_user t_user_role t_role
id name < ——-userid roleid —– > id name
5. 双向一对多
上面提到了单向的1-N在一的一端添加的外键指向多的一端即可,对于双向的1-N则类似于N-N,集合元素中不使用
元素映射关联属性,而使用元素,但是为了保证一的一端,因此需要增加unique=”true”属性<class name="xxx.Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students"> <key column="classesid"/> <many-to-many class="xxx.Student" unique="true"/> </set> </class>
双向的一对一关联有两种形式:
(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方法 }
<class name="xxx.Person" table="t_person"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="identityId" class="xxx.IdentityId" unique="true"/> </class>
<class name="xxx.IdentityId" table="t_identity"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <one-to-one name="person" class="xxx.Person" property-ref="identityId"/> </class>
因此只要调用identity持久化对象的getIdentityId()方法就可以导航到Person对象 由此可见:
Person对象和IdentityId对象之间为双向的关联关系person.getIdentityId().getPerson();
(2)、基于主键的1-1双向关联
上面的POJO类不需要有任何变化,我们只需要修改配置文件<class name="xxx.Person" table="t_person"> <id name="id" column="ID"> <generator class="foreign"> <param name="property">identityId</param> </generator> </id> <property name="name"/> <one-to-one name="identity" clsss="xxx.IdentityId" constrained="true"/> </class>
<class name="xxx.Identity" table="t_identity"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <one-to-one name="person" class="xxx.Person"/> </class>
对象与关联的IdentityId对象共享一个主键
7. 双向多对多
双向的多对多映射需要在两边都增加集合元素,用于映射集合属性
修改上面的单向N-N映射
在Role中添加集合属性public class Role { private int id; private String name; privarte Set user ..//生成相应的getter、setter方法 }
<class name="xxx.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="userid"/> <many-to-many class="xxx.Role" column="roleid"/> </set> </class>
<class name="xxx.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="users" table="t_user_role" order-by="userid"> <key column="roleid"/> <many-to-many class="xxx.User" column="userid"/> </set> </class>
四、主配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "https://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="mysqldb"> <!-- 配置方言:选择数据库类型 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 配置数据库连接信息 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql:///test?characterEncoding=utf8</property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <!-- 允许显示sql语句 --> <property name="show_sql">true</property> <!-- 导入映射文件 --> <mapping resource="com/mypro/domain/Person.hbm.xml" /> </session-factory> </hibernate-configuration>
< property name=“dialect”><property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 指定数据库类型为Mysql --> <property name="dialect">hibernate.dialect org.hibernate.dialect.OracleiDialect</property> <!-- 指定数据库类型为Oracle --> <property name="dialect">hibernate.dialect org.hibernate.dialect.SQLServerDialect</property> <!-- 指定数据库类型为Sql Server -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///test?characterEncoding=utf8</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
a、create-drop:表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用
b、create:在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的先删掉再创建,没有旧的,直接创建
c、update:加载hibernate自动更新数据库结构,如果没有表,则创建,如果有,且有更新,则直接更新,没有更新,则不变化
d、校验映射文件和数据库中的表是不是能对应起来,不能对应报错,实际中常用
总之请慎重使用此参数,没必要就不要随便用。
<!-- 允许显示sql语句 --> <property name="show_sql">true</property> <!-- 格式化sql语句 --> <property name="format_sql">true</property> <!-- 设置连接池大小 --> <property name="connection.pool.size">20</property> <!--jdbc.fetch_size是指Hibernate每次从数据库中取出并放到JDBC的Statement中的记录条数。FetchSize设的越大,读数据库的次数越少,速度越快,Fetch Size越小,读数据库的次数越多,速度越慢--> <property name="jdbc.fetch_size">50</property> <!--jdbc.batch_size是指Hibernate批量插入,删除和更新时每次操作的记录数。BatchSize越大,批量操作的向数据库发送Sql的次数越少,速度就越快,同样耗用内存就越大--> <property name="jdbc.batch_size">23</property> <!--connection.useUnicode连接数据库时是否使用Unicode编码--> <property name="Connection.useUnicode">true</property> <!--connection.characterEncoding连接数据库时数据的传输字符集编码方式--> <propertynamepropertyname="connection.characterEncoding">gbk</property>
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算