以hibernate.get(String, Serializable)方法为例:
get()的方法实现为:
图1:
public Object get(String entityName, Serializable id, LockMode lockMode) throws HibernateException { LoadEvent event = new LoadEvent(id, entityName, lockMode, this); fireLoad(event, LoadEventListener.GET); return event.getResult(); } private void fireLoad(LoadEvent event, LoadType loadType) { errorIfClosed(); checkTransactionSynchStatus(); LoadEventListener[] loadEventListener = listeners.getLoadEventListeners(); for ( int i = 0; i < loadEventListener.length; i++ ) { loadEventListener[i].onLoad(event, loadType); } }
图2:
public void onLoad(LoadEvent event, LoadEventListener.LoadType loadType) throws HibernateException { final SessionImplementor source = event.getSession(); EntityPersister persister; if ( event.getInstanceToLoad() != null ) { persister = source.getEntityPersister( null, event.getInstanceToLoad() ); //the load() which takes an entity does not pass an entityName event.setEntityClassName( event.getInstanceToLoad().getClass().getName() ); } else { persister = source.getFactory().getEntityPersister( event.getEntityClassName() ); } if ( persister == null ) { throw new HibernateException( "Unable to locate persister: " + event.getEntityClassName() ); } if ( persister.getIdentifierType().isComponentType() && EntityMode.DOM4J == event.getSession().getEntityMode() ) { // skip this check for composite-ids relating to dom4j entity-mode; // alternatively, we could add a check to make sure the incoming id value is // an instance of Element... } else { Class idClass = persister.getIdentifierType().getReturnedClass(); if ( idClass != null && ! idClass.isInstance( event.getEntityId() ) ) { throw new TypeMismatchException( "Provided id of the wrong type for class " + persister.getEntityName() + ". Expected: " + idClass + ", got " + event.getEntityId().getClass() ); } } EntityKey keyToLoad = new EntityKey( event.getEntityId(), persister, source.getEntityMode() ); try { if ( loadType.isNakedEntityReturned() ) { //do not return a proxy! //(this option indicates we are initializing a proxy) event.setResult( load(event, persister, keyToLoad, loadType) ); } else { //return a proxy if appropriate if ( event.getLockMode() == LockMode.NONE ) { event.setResult( proxyOrLoad(event, persister, keyToLoad, loadType) ); } else { event.setResult( lockAndLoad(event, persister, keyToLoad, loadType, source) ); } } } catch(HibernateException e) { log.info("Error performing load command", e); throw e; } }
如代码所示:当执行get()方法时,首先创建一个loadEvent,然后触发加载操作,获取对应listeners做出对应的响应;
SessionImpl为被观察者, listers为观察者, event为事件, event中包含了事件相关的属性。
ps:图1中为SessionImpl中的代码(SessionImpl为session的实现类), 图2为DefaultLoadEventListener的代码(DefaultLoadEventListener为LoadEventListener的实现类)
相关推荐
本项目"Hibernate+Struts2+观察者+工厂模式实例项目"就是一个典型的Java Web开发案例,它巧妙地结合了ORM框架Hibernate、MVC框架Struts2以及设计模式中的观察者模式和工厂模式,旨在提供一种高效、易于扩展的解决...
"java设计模式 中文"这本书可能涵盖了多种经典的设计模式,如单例模式(Singleton)、工厂模式(Factory)、观察者模式(Observer)、装饰器模式(Decorator)和代理模式(Proxy)等。这些模式可以帮助开发者更好地...
此外,很多知名框架和库,如Spring、Hibernate等,都大量运用了设计模式,学习设计模式有助于更好地理解和使用这些工具。 6. **设计模式的优缺点**:设计模式虽然带来了诸多好处,但并非万能解药。过度使用或不恰当...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
行为型设计模式则关注对象间的交互和责任分配,如观察者模式、策略模式、模板方法模式、命令模式、迭代器模式、职责链模式、备忘录模式、状态模式、访问者模式和解释器模式,这些模式能够使代码更加模块化,提高代码...
这份文档可以帮助开发者理解和运用如工厂模式、单例模式、观察者模式等经典设计模式,提升代码的可读性和可维护性。 这些API文档和设计模式指南构成了一个全面的WEB开发参考资料库,无论你是初学者还是经验丰富的...
设计模式是软件工程中的一种最佳实践,它提供了一种在特定场景下解决常见问题的模板。在Java开发中,理解并应用设计模式是提升代码质量和可维护性的重要途径。本资源包“JAVA版-设计模式解析(第二版)综合项目实战pdf...
在源代码中,我们还会发现一些关键的API和设计模式,比如工厂模式用于创建不同类型的生成器,观察者模式用于监听并响应数据库结构的变化,以及责任链模式在处理代码生成流程中的应用。这些设计模式的运用使得代码...
同时,阅读优秀的开源项目源码,如Spring、Hibernate等,是理解设计模式在实际场景中应用的好途径。 总结来说,设计模式是提升软件质量的重要手段,它们提供了一套通用的解决方案模板。通过学习和实践,我们可以更...
在 Java EE 中,也有很多设计模式的应用,例如在 Hibernate 中使用了代理模式和装饰模式。 设计模式是一种解决软件设计问题的方法,可以帮助开发者更好地设计和实现软件系统。在 Java 中,设计模式的应用非常广泛,...
12. **设计模式**: Hibernate源码中大量使用了设计模式,如工厂模式、单例模式、代理模式、观察者模式等,学习源码有助于深化对设计模式的理解。 通过深入分析Hibernate 3.6的源码,我们可以更深入地了解ORM的工作...
8. **设计模式与框架**:许多成熟的企业级框架,如Spring、Hibernate和.NET Framework,都大量使用了设计模式。了解设计模式有助于我们理解和使用这些框架,同时也可以提高自定义框架或库的能力。 9. **学习和实践*...
- 观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。 - 状态模式(State):允许对象在其内部状态改变时改变其行为。 - 策略模式...
7. **设计模式**:在源码中识别并学习使用的设计模式,如工厂模式、代理模式、单例模式等,这些都是软件设计的基础。 8. **元数据获取**:研究Hibernate如何从XML或注解中获取类和属性的元数据,以便进行对象关系...
设计模式是软件开发中的一种最佳实践,它是在特定情境下解决问题的经验总结,目的是为了提高代码的可重用性、可维护性和可扩展性。在Java的SSH三大框架中,Struts、Hibernate和Spring都广泛地应用了设计模式。 首先...
学习和理解设计模式不仅有助于写出高质量的Java代码,还能帮助开发者更好地理解和利用已有的开源框架和库,因为许多知名框架(如Spring、Hibernate)都大量应用了设计模式。在实际工作中,结合Java的特性(如多态、...
在Java开发中,常见的设计模式如单例模式、工厂模式、观察者模式、装饰器模式等都有其实际应用。这些模式可以帮助我们写出可维护、可扩展的代码。 在`HibernateDemo1.zip`中,你可能会看到如何集成Ehcache到...
本篇文章将深入探讨“java-javaee-软件工程-设计模式”这一主题,并结合SSH2(Struts、Spring、Hibernate)框架,解析相关知识点。 首先,Java和JavaEE是两种广泛应用于企业级应用开发的技术栈。Java是一种面向对象...
行为型模式如观察者模式,它定义了对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新;策略模式则允许在运行时选择算法或策略。 在实际开发中,MVC(Model-View-...