的任何一方导航到另一方。这需要在两个类中都设置关联。在`Person`类中已经有了对`Event`的关联,现在我们需要在`Event`类中添加对`Person`的关联。
首先,更新`Event`类,添加一个`Set`属性来存储参与事件的人员:
```java
Public class Event {
Private Set<Person> attendees = new HashSet<>();
Public Set<Person> getAttendees() {
return attendees;
}
Public void setAttendees(Set<Person> attendees) {
this.attendees = attendees;
}
}
```
接下来,我们需要在`event`的映射文件中添加对`Person`的关联:
```xml
<set name="attendees" table="PERSON_EVENT">
<key column="EVENT_ID"/>
<many-to-many column="PERSON_ID" class="Person"/>
</set>
```
这样,我们就创建了一个双向关联。在Java代码中,我们可以从`Person`导航到其参加的`Event`,也可以从`Event`导航到参加它的所有`Person`。
1.3.6 保存双向关联
在添加或修改双向关联时,必须确保两边的关联都被正确更新。例如,当一个`Person`参加一个`Event`时,需要同时更新`Person`的`events`集合和`Event`的`attendees`集合:
```java
public void registerForEvent(Long personId, Long eventId) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Person aPerson = (Person) session.load(Person.class, personId);
Event anEvent = (Event) session.load(Event.class, eventId);
aPerson.getEvents().add(anEvent);
anEvent.getAttendees().add(aPerson);
session.getTransaction().commit();
}
```
1.4 查询和检索
Hibernate 提供了丰富的查询语言 HQL(Hibernate Query Language)和 Criteria API 来检索数据。HQL 是面向对象的,允许我们基于对象的属性进行查询,而 Criteria API 则提供了更动态的方式,可以在运行时构建查询。
例如,使用 HQL 查询一个`Person`参加的所有`Event`:
```java
String hql = "FROM Event AS e WHERE e IN (:events)";
Query query = session.createQuery(hql);
query.setParameterList("events", aPerson.getEvents());
List<Event> events = query.list();
```
或者使用 Criteria API:
```java
Criteria criteria = session.createCriteria(Event.class);
criteria.createCriteria("attendees").add(Restrictions.eq("id", personId));
List<Event> events = criteria.list();
```
1.5 缓存和性能优化
Hibernate 提供了缓存机制来提高性能,包括一级缓存(Session 缓存)和二级缓存。一级缓存是默认开启的,每个 Session 内部的缓存,可以避免频繁的数据库访问。二级缓存则可以通过配置实现,它是在多个 Session 或者应用间共享的缓存,可以进一步提升性能。
1.6 事务管理
在 Hibernate 中,事务管理是非常关键的一部分。上述示例中的`beginTransaction()`、`commit()`和`rollback()`就是对事务的管理。在实际应用中,需要根据业务需求选择合适的事务隔离级别和回滚策略。
1.7 总结
Hibernate 作为一款强大的 ORM 框架,简化了 Java 应用与数据库之间的交互。通过映射文件和配置,我们可以将 Java 类与数据库表关联起来,实现对象的持久化。此外,Hibernate 还提供了关联映射、查询语言、缓存机制和事务管理等特性,极大地提高了开发效率和应用性能。理解并熟练掌握这些概念,将有助于构建高效、稳定的数据库驱动的 Java 应用。