栏目导航
热点推荐
- 三十条有用的 Java 编程规则
- Java制作水印图片源码
- Java常见异常及可能的导致原因
- Java中的修饰词使用方法总结
- J2EE系统异常的处理准则
- Java中的异常、断言、日志解析(
- Java面试技巧:Java面试题集锦(
- 面向Java开发人员的Scala指南:
- Java程序员:一刻钟精通正则表达
- 网友经验分享:学好java开发的关
- 专家解答:创建表格与数据库进行
- Java远程访问Domino数据库
阅览排行
在Hibernate中直接操作JDBC 接口方法
www.jz123.cn 2010-04-22 来源: 中国建站 责任编辑(袁袁) 我要投递新闻
在 Hibernate 框架中提供直接操作 JDBC 接口的原因
Hibernate 框架在处理复杂查询方面的问题
Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用面向对象编程思维来操纵数据库。Hibernate 的优势在于屏蔽了数据库细节,对于新增修改删除的数据层操作,不再需要跟具体的 SQL 语句打交道,简单的对对象实例进行增删改操作即可。
但是,对于多表关联、分组统计、排序等复杂的查询功能时,由于 Hibernate 自身的 O-R 映射机制,父子表之间关联取数据会产生大量冗余的查询操作,性能低下。此类情况下,直接使用 JDBC 的 SQL 语句反而更加灵活和高效。
Hibernate 框架处理复杂查询问题实例分析
考虑如下数据库实体示例,表 A 为主表,表 B 和表 C 为子表,A 与 B、A 与 C 表均为 1 对多关系,在 B 表和 C 表中以 A_ID 外键字段关联 A 表父记录。
图 1. 数据库实体示例图
在 Hibernate 框架中,通常采用以下配置方式完成 A 表与 B,C 表父子实体之间的级联查询操作,Hibernate 实体配置 XML 如下:
清单 1. hibernate 实体配置 xml
A.hbm.xml:
<hibernate-mapping>
<class name="XXX.XXX.A" table="A" >
<id name="id" type="long">
<column name="ID"/>
<generator class="assigned">
</generator>
</id>
<set name="children_B" cascade="delete" inverse="true" lazy="false">
<key column="A_ID"></key>
<one-to-many class="XXX.XXX.B"/>
</set>
<set name="children_C" cascade="delete" inverse="true" lazy="false">
<key column="A_ID"></key>
<one-to-many class="XXX.XXX.C"/>
</set>
</class>
</hibernate-mapping>
B.hbm.xml:
<hibernate-mapping>
<class name="XXX.XXX.B" table="B" >
<id name="id" type="long">
<column name="ID"/>
<generator class="assigned">
</generator>
</id>
<property name="a_id" type="long">
<column name="A_ID">
</column>
</property>
</class>
</hibernate-mapping>
C.hbm.xml
<hibernate-mapping>
<class name="XXX.XXX.C" table="C" >
<id name="id" type="long">
<column name="ID"/>
<generator class="assigned">
</generator>
</id>
<property name="a_id" type="long">
<column name="A_ID">
</column>
</property>
</class>
</hibernate-mapping>
对应的 Hibernate 领域实体类代码示例如下:
清单 2. hibernate 实体类示例
A.java:
public class A implements java.io.Serializable,Comparable {
private long id;
private Set children_b = new HashSet();
private Set children_c = new HashSet();
public A(long id) {
this.id = id;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Set getChildern_b() {
return children_b;
}
public void setChildren_b (Set children_b) {
this.children_b = children_b;
}
public Set getChildern_c() {
return children_c;
}
public void setChildren_c (Set children_c) {
this.children_c = children_c;
}
public int compareTo(Object other) {
A otherSubject = (A)other;
long curAmount=this.getChildren_b().size()+this.getChildren_c().size();
long otherAmount =otherSubject.getChildren_b().size()
+ otherSubject.getChildren_c().size();
if(curAmount
{
return -1;
}
else if(curAmount>otherAmount)
{
return 1;
}
else
{
return 0;
}
}
}
B.java:
public class B implements java.io.Serializable,Comparable {
private long id;
private long a_id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public long getA_id() {
return a_id;
}
public void setA_id(long a_id) {
this.a_id = a_id;
}
public B(long id) {
this.id=id;
}
}
C.java:
public class C implements java.io.Serializable,Comparable {
private long id;
private long a_id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public long getA_id() {
return a_id;
}
public void setA_id(long a_id) {
this.a_id = a_id;
}
public C(long id) {
this.id=id;
}
}
上一篇:Java读取xml文件的四种方法 下一篇:Java script基本语法4个关键提问