Hibernate数据操作与集合映射全解析
立即解锁
发布时间: 2025-08-18 01:28:09 阅读量: 2 订阅数: 2 

### Hibernate数据操作与集合映射全解析
#### 1. 加载数据库数据到Java对象
要将数据库中的数据加载到Java对象,可以使用Hibernate查询语言(HQL),它能提供映射数据库表内容的面向对象视图。这些数据可能是上一个会话中持久化的对象,也可能来自应用程序代码之外。
##### 1.1 具体操作步骤
下面是一个使用Hibernate进行简单查询的示例程序`QueryTest.java`:
```java
package com.oreilly.hh;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.Configuration;
import java.sql.Time;
import java.util.*;
/**
* Retrieve data as objects
*/
public class QueryTest {
/**
* Retrieve any tracks that fit in the specified amount of time.
*
* @param length the maximum playing time for tracks to be returned.
* @param session the Hibernate session that can retrieve data.
* @return a list of {@link Track}s meeting the length restriction.
* @throws HibernateException if there is a problem.
*/
public static List tracksNoLongerThan(Time length, Session session)
throws HibernateException
{
return session.find("from com.oreilly.hh.Track as track " +
"where track.playTime <= ?",
length, Hibernate.TIME);
}
/**
* Look up and print some tracks when invoked from the command line.
*/
public static void main(String args[]) throws Exception {
// Create a configuration based on the properties file we've put
// in the standard place.
Configuration config = new Configuration();
// Tell it about the classes we want mapped, taking advantage of
// the way we've named their mapping documents.
config.addClass(Track.class);
// Get the session factory we can use for persistence
SessionFactory sessionFactory = config.buildSessionFactory();
// Ask for a session using the JDBC information we've configured
Session session = sessionFactory.openSession();
try {
// Print the tracks that will fit in five minutes
List tracks = tracksNoLongerThan(Time.valueOf("00:05:00"),
session);
for (ListIterator iter = tracks.listIterator() ;
iter.hasNext() ; ) {
Track aTrack = (Track)iter.next();
System.out.println("Track: \"" + aTrack.getTitle() +
"\", " + aTrack.getPlayTime());
}
} finally {
// No matter what, close the session
session.close();
}
// Clean up after ourselves
sessionFactory.close();
}
}
```
为了运行这个测试,需要在`build.xml`文件末尾添加一个目标:
```xml
<target name="qtest" description="Run a simple Hibernate query"
depends="compile">
<java classname="com.oreilly.hh.QueryTest" fork="true">
<classpath refid="project.class.path"/>
</java>
</target>
```
运行查询测试时,为了节省输出空间,可以编辑`log4j.properties`文件,将`log4j.logger.net.sf.hibernate=info`改为`log4j.logger.net.sf.hibernate=warn`。然后在命令行输入`ant qtest`,即可检索并显示数据。
##### 1.2 代码解释
在上述代码中,`tracksNoLongerThan`方法执行了实际的Hibernate查询,它使用HQL查询出播放时间小于或等于指定参数的所有曲目。HQL是一种受SQL启发但面向对象的查询语言,与SQL有重要区别。它支持参数占位符,类似于JDBC中的`PreparedStatement`。
查询语句`from com.oreilly.hh.Track as track where track.playTime <= ?`的含义如下:
- 从`com.oreilly.hh.Track`类中检索实例。
- 定义别名`track`来引用`Track`类的一个特定实例。
- 检索出`playTime`属性值小于或等于运行时传入的第一个(也是唯一的)查询参数的实例。
程序的其余部分与之前的示例类似,使用`try`块简化了代码,因为不需要事务,最后使用`finally`块确保会话被干净地关闭。
##### 1.3 删除对象的方法
如果想清空数据库以进行测试,可以运行`ant schema`,它会删除并重新创建`Track`表。如果想更有选择性地删除对象,可以通过以下两种方式:
- 在HSQLDB UI中使用SQL命令(`ant db`)。
- 创建一个查询测试示例的变体,检索出要删除的对象,然后将其传递给`Session`的`delete()`方法:
```java
session.delete(aTrack);
```
也可以传递一个匹配多个对象的HQL查询字符串给`delete()`方法,一次性删除多个持久化对象:
```java
session.delete("from com.oreilly.hh.Track");
```
无论使用哪种方法,都需要将数据操作代码包装在Hibernate事务中,并提交事务以使更改生效。
#### 2. 更好的查询构建方式
HQL不仅支持JDBC风格的查询占位符,还提供了更方便的方式来控制查询和管理查询文本。
##### 2.1 使用命名参数
使用命名参数可以使代码更易于理解,减少错误的可能性,并提高效率。以下
0
0
复制全文
相关推荐










