我们在使用一对一,一对多,多对多时,一般来说,表与表之间都会有相应的关联关系,但是Hibernate的作者考虑到了各种情况,比如虽然没有外键关系,可是A表的**字段就是B表的主键,这种情况也会有,在这种情况下,如果设设置Hibernate的一对一,一对多,程序也是可以运行的(前提是数据正确,也就是说符合外键的定义),所以外键的一个作用就是使数据符合规范.举个例子,在数据提供者忘记吃脑残片的情况下,比如A的**字段是B的主键,但是某条A的记录的**字段不为空,但是在B表中不能找到相应的记录,这种情况是不符合外键定义的,但是我们又不能改数据,Hibernate就能处理这样的情况:添加@NotFound(action = NotFoundAction.IGNORE)就能解决,所以说,外键并不是必须的,但是个人感觉有外键会比较好.以上是个人的一点小小经验.希望能帮到你
一、 hibernate简介hibernate是一个jdo工具。它的工作原理是通过文件(一般有两种:xml文件和properties文件)把值对象和数据库表之间建立起一个映射关系。这样,我们只需要通过操作这些值对象和hibernate提供的一些基本类,就可以达到使用数据库的目的。例如,使用hibernate的查询,可以直接返回包含某个值对象的列表(list),而不必向传统的jdbc访问方式一样把结果集的数据逐个装载到一个值对象中,为编码工作节约了大量的时间。hibernate提供的hql是一种类sql语言,它和ejbql一样都是提供对象化的数据库查询方式,但hql在功能和使用方式上都非常接近于标准的sql. 二、 hibernate与jdbc的区别hibernate与jdbc的主要区别如下: 1、 hibernate是jdbc的轻量级的对象封装,它是一个独立的对象持久层框架,和app server,和ejb没有什么必然的联系。hibernate可以用在任何jdbc可以使用的场合,从某种意义上来说,hibernate在任何场合下取代jdbc. 2、 hibernate是一个和jdbc密切关联的框架,所以hibernate的兼容性和jdbc驱动,和数据库都有一定的关系,但是和使用它的java程序,和app server没有任何关系,也不存在兼容性问题。 3、 hibernate是做为jdbc的替代者出现的,不能用来直接和entity bean做对比。 三、 hibernate 进行多表关联查询hibernate对多个表进行查询时,查询结果是多个表的笛卡尔积,或者称为“交叉”连接。 例如:from student, book from student as stu, book as boo from student stu, book boo注意:让查询中的student和book均是表student和book对应的类名,它的名字一定要和类的名字相同,包括字母的大小写。别名应该服从首字母小写的规则是一个好习惯,这和java对局部变量的命名规范是一致的。 下面列举一个完整的例子来说明hibernate对多个表进行关联查询(其中粗体是我们要特别注意的地方,相应表tbookinfo和bookselection的结构和其对应的hbm.xml、class文件就不一一列举了,有需要详细了解的朋友,请联系我): string stest = "from tbookinfo book, bookselection sel where book.id = sel.bookid"; collection result = new arraylist(); transaction tx = null; try { session session = hibernateutil.currentsession(); tx = session.begintransaction(); query query = session.createquery(sql); result = query.list(); tx.commit(); } catch (exception e) { throw e; } finally { hibernateutil.closesession(); } //result list为object[] 的集合{{object[] } ,{object[] } ,{object[] } } //object[] :{tbookinfo ,bookselection }与查询语句的顺序有关 arraylist slist = (arraylist) result; iterator iterator1 = slist.iterator(); while (iterator1.hasnext()) { object[] o = (object[]) iterator1.next(); ookinfo bookinfo = (tbookinfo) o[0]; bookselection bookselect = (bookselection) o[1]; system.out.println("bookinfo-title: " bookinfo.gettitle()); system.out.println("bookselection-bookselectionid: " bookselect.getid()); }
应该是有没有外键把,关联的话有外键,不关联的话,数据库表没有外键
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....