锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
聽 絎竴嬈″啓鏂囩珷錛屼笉濂界殑鍦版柟錛岃鍙d笅鐣欐儏鍝堛?/span>
聽 org.hibernate.cfg.Configurations 鏍規嵁 xml 鏂囦歡閰嶇疆鏁翠釜宸ヤ綔榪囩▼涓墍闇瑕佺殑鍙傛暟銆備竴鑸?/span>
鎴戜滑浼氱敤 Configuration cfg = new Configuration().configure(); 鍒涘緩涓涓厤緗被銆傞偅涔堬紝榪欏彞璇濆埌搴曞仛浜嗕粈涔堝憿錛?/span>
聽 棣栧厛錛?/span> new Configuration() 浼氬仛浜涗粈涔堝憿錛熸垜浠潵鐪嬩粬鐨勬簮鐮侊細
聽聽
聽
protected Configuration(SettingsFactory settingsFactory) {
聽聽聽聽聽聽聽 System.out.println("Configuration(SettingsFactory settingsFactory)");
聽聽聽聽聽聽聽 this.settingsFactory = settingsFactory;
聽聽聽聽聽聽聽 reset();
聽聽聽 }
// 榛樿鏋勯犲嚱鏁幫紝鍏?/span> new SettingsFactory() 錛?/span> 鐒跺悗璋冪敤
//protected Configuration(SettingsFactory settingsFactory)
聽聽聽
public Configuration() {
聽聽聽聽聽聽聽 this(new SettingsFactory());
}
reset() 鍒濆鍖栦簡寰堝鍙橀噺錛屾劅鍏磋叮鐨勫彲浠ュ幓鐪嬫簮浠g爜錛屾病鏈変粈涔堢壒鍒殑鍦版柟銆?/span>
聽
聽 鎺ョ潃錛岃皟鐢?/span> configure() 鏂規硶錛?/span>
public Configuration configure() throws HibernateException {
聽聽聽聽聽聽聽 configure("/hibernate.cfg.xml");
聽聽聽聽聽聽聽 return this;
}
鍙互鐪嬪嚭錛岄粯璁や嬌鐢?/span> hibernate.cfg.xml 鏂囦歡錛屽鏋滄兂鐢ㄨ嚜瀹氫箟鐨勬枃浠訛紝鍙互璋冪敤
configure(鈥溾?xml鈥? 鏂規硶銆?/span>
public Configuration configure(String resource) throws HibernateException {
聽聽聽聽聽聽聽 log.debug("configuring from resource: " + resource);
聽聽聽聽聽聽聽 InputStream stream = getConfigurationInputStream(resource);
聽聽聽聽聽聽聽 return doConfigure(stream, resource);
}
鏍規嵁
getConfigurationInputStream(resource)
寰楀埌鏂囦歡嫻侊紝
getConfigurationInputStream(resource)
璋冪敤
ConfigHelper.getResourceAsStream(resource)
銆?/span>
public static InputStream getResourceAsStream(String resource) {
聽聽聽聽聽聽聽聽聽聽聽聽聽 String stripped = resource.startsWith("/") ?
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 resource.substring(1) : resource;
聽聽聽聽聽聽聽聽聽聽聽聽聽 InputStream stream = null;
聽聽聽聽聽聽聽聽聽聽聽聽聽 ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
聽聽聽聽聽聽聽聽聽聽聽聽聽 if (classLoader!=null) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 stream = classLoader.getResourceAsStream( stripped );
聽聽聽聽聽聽聽聽聽聽聽聽聽 }
//
榪欓噷鐨勪唬鐮佸彲鑳藉簲璇ユ槸
stream = Environment.class.getResourceAsStream( resource );
聽聽聽聽聽聽聽聽聽聽聽聽聽
if ( stream == null ) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Environment.class.getResourceAsStream( resource );
聽聽聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽聽聽 if ( stream == null ) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 stream = Environment.class.getClassLoader().getResourceAsStream( stripped );
聽聽聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽聽聽 if ( stream == null ) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 throw new HibernateException( resource + " not found" );
聽聽聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽聽聽 return stream;
聽聽聽聽聽聽 }
鐒跺悗
doConfigure(stream, resource)
銆?/span>
protected Configuration doConfigure(InputStream stream, String resourceName) throws HibernateException {
org.dom4j.Document doc;
聽聽聽聽聽聽聽 try {
聽聽聽聽聽聽聽聽聽聽聽 List errors = new ArrayList();
聽聽聽聽聽聽聽聽聽聽聽 SAXReader saxReader = xmlHelper.createSAXReader(resourceName, errors, entityResolver);
聽聽聽聽聽聽聽聽聽聽聽 doc = saxReader.read(new InputSource(stream));
聽聽聽聽聽聽聽聽聽聽聽 if (errors.size() != 0) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 throw new MappingException(
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 "invalid configuration",
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 (Throwable) errors.get(0)
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 );
聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 }
entityResolver 鍦ㄥ垵濮嬪間負 entityResolver = XMLHelper.DEFAULT_DTD_RESOLVER ; 鍦?/span> reset() 鐨勬椂鍊欒緗殑銆?/span> XMLHelper.DEFAULT_DTD_RESOLVE 鍦?/span> XMLHelper 榛樿鏄?/span> XMLHelper.DEFAULT_DTD_RESOLVER= new DTDEntityResolver() 錛?/span> DTDEntityResolver 鏄敤鏉ュ姞杞?/span> dtd 鏂囦歡鐨勩傚埆璺熸垜璇翠綘涓嶇煡閬?/span> dtd 鏄粈涔堜笢瑗匡紵瀹冩湁 3 縐嶅姞杞芥柟寮忥細
1錛?span style="FONT: 7pt 'Times New Roman'">聽 鏂囦歡璺緞浠?/span> http://hibernate.sourceforge.net/ 寮澶寸殑鏂囦歡錛屽
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd 錛?/span>
瀹冧細鎶?/span> http://hibernate.sourceforge.net 鍘繪帀錛屽姞涓?/span> org/hibernate/ 錛屾枃浠惰礬寰勪負
org/hibernate/hibernate-configuration-3.0.dtd 錛岀劧鍚庡姞杞借繖涓枃浠躲?/span>
2.聽聽聽聽聽聽 鏂囦歡璺緞浠?/span> file:// 寮澶寸殑鏂囦歡錛屽
聽 file://hibernate-configuration-3.0.dtd 錛?/span>
瀹冧細鎶?/span> file:// 鍘繪帀錛岃礬寰勪負 hibernate-configuration-3.0.dtd 錛岀劧鍚庡姞杞借繖涓枃浠躲?/span>
3. 濡傛灉娌℃湁浠ヤ笂 2 縐嶆儏鍐碉紝鍒欑洿鎺ュ姞杞姐傚氨鏄礬寰勫悕娌℃湁淇敼榪囥?/span>
鏁翠釜榪囩▼鍦?/span> public InputSource resolveEntity(String publicId, String systemId) 涓疄鐜般?/span>
systemId 灝辨槸 dtd 鐨勮礬寰勩傚ぇ瀹跺彲浠ュ幓鐪嬬湅 SAXReader 綾昏嚜甯︾殑
protected static class SAXEntityResolver 錛屾瘮杈冩瘮杈冦?/span>
聽
鍦ㄥ緱鍒?/span> doc 鐨勫?/span>
聽聽聽聽聽聽聽聽聽聽聽
doc = saxReader.read(new InputSource(stream));
鍚庯紝璋冪敤 protected Configuration doConfigure(org.dom4j.Document doc) 錛岃繖涓嚱鏁頒富瑕佹槸鏍規嵁 doc 鐨勫埌閰嶇疆鍙傛暟錛岀劧鍚庡瓨鍒?/span> properties 涓?/span>
聽 鍏堟槸璁劇疆 session-factory 鐨勫悕瀛楋細
Element sfNode = doc.getRootElement().element("session-factory");
聽聽聽聽聽聽聽 String name = sfNode.attributeValue("name");
聽聽聽聽聽聽聽 if (name != null) {
聽聽聽聽聽聽聽聽聽聽聽聽 //
淇濆瓨鍒?/span>
properties
涓紒
聽聽聽聽聽聽聽聽聽聽聽 properties.setProperty(Environment.SESSION_FACTORY_NAME, name);
聽聽聽聽聽聽聽 }
鐒跺悗鏄?/span> addProperties(sfNode) 錛屾妸 <property name=" "> </property> 淇濆瓨鍒?/span> properties 涓?/span>
//
榪欏彞璇濅及璁″張鏄浣欑殑
properties.setProperty(name, value);
聽聽聽聽聽聽聽聽聽聽
聽if (!name.startsWith("hibernate")) {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 properties.setProperty("hibernate." + name, value);
聽聽聽聽聽聽聽聽聽聽聽 }
鎺ョ潃璋冪敤浜?/span> parseSessionFactory(sfNode, name) 錛屾妸 mapping 錛?/span> class-cache 錛?/span> collection-cache 錛?/span> listener 錛?/span> event 絳夐厤緗繚瀛樸傚埌搴曞畠淇濆瓨鍒板摢錛屾垜涔熶笉鍏ㄧ煡閬擄紝鍙湅浜?/span>
protected void parseMappingElement(Element subelement, String name), 鏍規嵁閰嶇疆鍔犺澆浜?/span> mapping 鐨勬枃浠訛紝鏈鍚庝嬌鐢?/span> HbmBinder : public static void bindRoot(Document doc, Mappings mappings, java.util.Map inheritedMetas) 淇濆瓨銆?/span> bindRoot 鏄 mapping 涓殑 xml 鏂囦歡榪涜瑙f瀽銆?/span>
HbmBinder 鍜?/span> Configuration 閮芥湁 2000 琛屼互涓婄殑浠g爜錛屽湪 Hibernate 涓湁寰堥噸瑕佺殑鍦頒綅銆?/span> Configuration 浣跨敤 .cfg.xml 錛岃?/span> HbmBinder 鍒欎嬌鐢ㄤ簡 .hbm.xml 銆?/span>
聽聽聽聽聽聽聽聽聽聽聽聽聽 extractRootAttributes( hmNode, mappings ) 鏍規嵁 <hibernate-mapping> 鐨勯厤緗紝鎶婂垎鏋愮殑緇撴灉瀛樺叆 mapping 銆?/span>
聽