Java中使用Hibernate系列之映射关联启动工作学习(第五节)

时间:2022-04-29
本文章向大家介绍Java中使用Hibernate系列之映射关联启动工作学习(第五节),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前面一节我们建好了映射文件,现在我们把people和events 一起放到EventManager的新方法中统一管理:

private void addPersonToEvent(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);
session.getTransaction().commit();
}

在加载一Person和Event后,使用普通的集合方法就可容易地修改我们定义的集合,Hibernate会自动检测到集合已经被修改并需要更新回数据库,这叫做自动脏检查(automatic dirty checking),你也可以尝试修改任何对象的name或者date属性,只要他们处于持久化状态,也就是被绑定到某个Hibernate 的Session上,Hibernate监视任何改变并在后台隐式写的方式执行SQL。

网络配图

同步内存状态和数据库的过程,通常只在单元操作结束的时候发生,称此过程为清理缓存(flushing),在我们的代码中,工作单元由数据库事务的提交(或者回滚)来结束——这是由CurrentSessionContext类的thread配置选项定义的。

当然,你也可以在不同的单元操作里面加载person和event,或在Session以外修改不是处在持久化(persistent)状态下的对象,还可以在一个集合被脱管时修改它:

private void addPersonToEvent(Long personId, Long eventId) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Person aPerson = (Person) session
.createQuery("select p from Person p left join fetch p.events where p.id = :pid")
.setParameter("pid", personId)
.uniqueResult();
Event anEvent = (Event) session.load(Event.class, eventId);
session.getTransaction().commit();
aPerson.getEvents().add(anEvent);
Session session2 = HibernateUtil.getSessionFactory().getCurrentSession();
session2.beginTransaction();
session2.update(aPerson);
session2.getTransaction().commit();
}

对update的调用使一个脱管对象重新持久化,你可以说它被绑定到一个新的单元操作上,所以在脱管状态下对它所做的任何修改都会被保存到数据库里,这也包括你对这个实体对象的集合所作的任何改动(增加/删除)。 这对我们当前的情形不是很有用,但它是非常重要的概念,你可以把它融入到你自己的应用程序设计中,在EventManager的main方法中添加一个新的动作,并从命令行运行它来完成我们所做的练习,如果你需要person及event的标识符 — 那就用save()方法返回它,代码如下:

else if (args[0].equals("addpersontoevent")) {
Long eventId = mgr.createAndStoreEvent("My Event", new Date());
Long personId = mgr.createAndStorePerson("Foo", "Bar");
mgr.addPersonToEvent(personId, eventId);
System.out.println("Added person " + personId + " to event " + eventId);
}

我们可以自己设计一个值类型的集合,这在概念上与引用其它实体的集合有很大的不同。

好了,这一节的学习先到这里,后面章节中会继续学习Hibernate。我们学习方式是每一节学习一个知识点(每天花10分钟学习)。