Java中使用Hibernate系列之映射关联启动工作学习(第五节)
Java学习网(www.javalearns.com)提拱
前面一节我们建好了映射文件,现在我们把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分钟学习)。
请↙↙↙点击“阅读原文” ….
- 颍州区医共体中心药房正式投入使用
- 颈椎不好,只需一个小方法,就解决了
- 每日一图 | 降低天然气使用能够减少多少碳排放?
- 幻想一夜暴富,大悟男子使用防狼喷雾流窜抢劫两金店
- 微信最新版本推出三大重磅功能!又搞大事情了!你使用这些新功能
- 天津规定自愿换领新能源车号牌 不换领可正常使用
- 怎么使用 SVG 作为一个图像占位符
- 7 个使用 bcc/BPF 的性能分析神器
- Docker:使用多阶段构建镜像
- 乱点眼药水小心酿大祸,这些使用常识你要知道