Hibernateä¸çupdate()åsaveOrUpdate()çåºå«ï¼sessionçload()åget()çåºå«
saveOrUpdate()å ¶å®å¨ç¨æ³ä¸å æ¬update()ï¼å¯ä»¥è¯´saveOrUpdate()æ¯ç»åäºsave()ãupdate()æ¹æ³ï¼å¨æ§è¡saveOrUpdate()æ¹æ³çæ¶åå¤ææ¯å¦åå¨è¯¥æ¡è®°å½ï¼åå¨åæ§è¡updateï¼ä¸åå¨åæ§è¡saveãload()åget()æå°±åºç¨çæ¯è¾å°äºÂ·Â·Â·- -!
lazyloadHibernate lazy load
Hibernate,一个知名的对象关系映射(ORM)框架,内置了懒加载(lazy load)功能。这是一种智能的数据加载策略,旨在优化数据库性能。当我们在初始化模型时,android 轨迹记录源码Hibernate会预先创建数据库操作对象,但这并不意味着会立即与数据库建立连接。相反,它会推迟到实际需要查询数据时才执行连接操作,从而避免不必要的数据库开销。
懒加载特别适用于处理大规模数据查询。例如,当我们只关心部分数据,而其他数据暂时无需使用时,可以延迟加载,直到这些数据真正被请求。这样可以显著提升系统的响应速度,因为只在必要时才进行查询,iappapicloud源码而不是一开始就加载所有数据,消耗内存资源。
通过这种方式,Hibernate能够灵活地管理数据获取,确保在满足性能需求的同时,也降低了系统的复杂性。总的来说,懒加载是Hibernate提供的一种高效数据管理策略,使得在处理大量数据时,ensp源码我们能够更加智能地控制数据的加载和使用。
hibernateä¸getåloadï¼findçåºå«
getåloadæ¹å¼æ¯æ ¹æ®idåå¾ä¸ä¸ªè®°å½
ä¸è¾¹è¯¦ç»è¯´ä¸ä¸getåloadçä¸åï¼å 为æäºæ¶å为äºå¯¹æ¯ä¹ä¼æfindå è¿æ¥ã
1.ä»è¿åç»æä¸å¯¹æ¯ï¼
loadæ¹å¼æ£ç´¢ä¸å°çè¯ä¼æåºorg.hibernate.ObjectNotFoundExceptionå¼å¸¸
getæ¹æ³æ£ç´¢ä¸å°çè¯ä¼è¿ånull
2.ä»æ£ç´¢æ§è¡æºå¶ä¸å¯¹æ¯ï¼ getæ¹æ³åfindæ¹æ³é½æ¯ç´æ¥ä»æ°æ®åºä¸æ£ç´¢ èloadæ¹æ³çæ§è¡åæ¯è¾å¤æé¦å æ¥æ¾sessionçpersistent Contextä¸æ¯å¦æç¼åï¼å¦ææåç´æ¥è¿å å¦æ没æåå¤ææ¯å¦æ¯lazyï¼å¦æä¸æ¯ç´æ¥è®¿é®æ°æ®åºæ£ç´¢ï¼æ¥å°è®°å½è¿åï¼æ¥ä¸å°æåºå¼å¸¸ å¦ææ¯lazyåéè¦å»ºç«ä»£ç对象ï¼å¯¹è±¡çinitializedå±æ§ä¸ºfalseï¼targetå±æ§ä¸ºnull å¨è®¿é®è·å¾ç代ç对象çå±æ§æ¶,æ£ç´¢æ°æ®åºï¼å¦ææ¾å°è®°å½åæ该记å½ç对象å¤å¶å°ä»£ç对象çtargetä¸ï¼å¹¶å°initialized=trueï¼å¦ææ¾ä¸å°å°±æåºå¼å¸¸ã
3.æ ¹æ¬åºå«è¯´æ
å¦æä½ ä½¿ç¨loadæ¹æ³ï¼hibernate认为该id对åºç对象ï¼æ°æ®åºè®°å½ï¼å¨æ°æ®åºä¸æ¯ä¸å®åå¨çï¼æ以å®å¯ä»¥æ¾å¿ç使ç¨ï¼å®å¯ä»¥æ¾å¿ç使ç¨ä»£çæ¥ å»¶è¿å 载该对象ãå¨ç¨å°å¯¹è±¡ä¸çå ¶ä»å±æ§æ°æ®æ¶ææ¥è¯¢æ°æ®åºï¼ä½æ¯ä¸ä¸æ°æ®åºä¸ä¸åå¨è¯¥è®°å½ï¼é£æ²¡åæ³ï¼åªè½æå¼å¸¸ãæ说çloadæ¹æ³æå¼å¸¸æ¯æå¨ä½¿ç¨ 该对象çæ°æ®æ¶ï¼æ°æ®åºä¸ä¸åå¨è¯¥æ°æ®æ¶æå¼å¸¸ï¼èä¸æ¯å¨å建è¿ä¸ªå¯¹è±¡æ¶(注æï¼è¿å°±æ¯ç±äºâ延è¿å è½½âå¨ä½æª)ã
ç±äºsessionä¸çç¼å对äºhibernateæ¥è¯´æ¯ä¸ªç¸å½å»ä»·çèµæºï¼æ以å¨loadæ¶ä¼å æ¥ä¸ä¸sessionç¼åçç该id对åºç对象æ¯å¦åå¨ï¼ä¸åå¨åå建代çãæ以å¦æä½ ç¥é该idå¨æ°æ®åºä¸ä¸å®æ对åºè®°å½åå¨å°±å¯ä»¥ä½¿ç¨loadæ¹æ³æ¥å®ç°å»¶è¿å è½½ã
对äºgetæ¹æ³ï¼hibernateä¼ç¡®è®¤ä¸ä¸è¯¥id对åºçæ°æ®æ¯å¦åå¨ï¼é¦å å¨sessionç¼åä¸æ¥æ¾ï¼ç¶åå¨äºçº§ç¼åä¸æ¥æ¾ï¼è¿æ²¡æå°±æ¥æ°æ®åºï¼æ°æ®åºä¸æ²¡æå°±è¿ånullã
对äºloadågetæ¹æ³è¿åç±»åï¼è½ç¶å¥½å¤ä¹¦ä¸é½è¿ä¹è¯´ï¼âget()æ°¸è¿åªè¿åå®ä½ç±»âï¼ä½å®é ä¸è¿æ¯ä¸æ£ç¡®çï¼getæ¹æ³å¦æå¨ sessionç¼åä¸æ¾å°äºè¯¥id对åºç对象ï¼å¦æå好该对象åé¢æ¯è¢«ä»£çè¿çï¼å¦è¢«loadæ¹æ³ä½¿ç¨è¿ï¼æè è¢«å ¶ä»å ³è对象延è¿å è½½è¿ï¼é£ä¹è¿åçè¿æ¯ åå ç代ç对象ï¼èä¸æ¯å®ä½ç±»å¯¹è±¡ï¼å¦æ该代ç对象è¿æ²¡æå è½½å®ä½æ°æ®ï¼å°±æ¯id以å¤çå ¶ä»å±æ§æ°æ®ï¼ï¼é£ä¹å®ä¼æ¥è¯¢äºçº§ç¼åæè æ°æ®åºæ¥å è½½æ°æ®ï¼ä½æ¯ è¿åçè¿æ¯ä»£ç对象ï¼åªä¸è¿å·²ç»å è½½äºå®ä½æ°æ®ã
getæ¹æ³é¦å æ¥è¯¢sessionç¼åï¼æ²¡æçè¯æ¥è¯¢äºçº§ç¼åï¼æåæ¥è¯¢æ°æ®åºï¼åèloadæ¹æ³å建æ¶é¦å æ¥è¯¢sessionç¼åï¼æ²¡æå°±å建代çï¼å®é 使ç¨æ°æ®æ¶ææ¥è¯¢äºçº§ç¼ååæ°æ®åºã
4.ç®åæ»ç»
æ»ä¹å¯¹äºgetåloadçæ ¹æ¬åºå«ï¼ä¸å¥è¯ï¼hibernate对äºloadæ¹æ³è®¤ä¸ºè¯¥æ°æ®å¨æ°æ®åºä¸ä¸å®åå¨ï¼å¯ä»¥æ¾å¿ç使ç¨ä»£çæ¥å»¶è¿å è½½ï¼å¦æå¨ä½¿ç¨è¿ç¨ä¸åç°äºé®é¢ï¼åªè½æå¼å¸¸ï¼è对äºgetæ¹æ³ï¼hibernateä¸å®è¦è·åå°çå®çæ°æ®ï¼å¦åè¿ånullã
org.hibernate.exception.GenericJDBCException: could not load an entity:
é¦å è¿ä¸ªé®é¢ä¸ä¸»é®çææ¹å¼æ²¡æå ³ç³»ï¼åµä¸æ¥¼ä¸»å¯è½ä½¿ç¨çæ¯Mysqlæ°æ®åºï¼å æ¤éç¨identityçææ¹å¼å®å ¨æ£ç¡®ã
å ¶æ¬¡å ³äºloadåæ°æ®åºç°é®é¢æ¯å 为åæ°æ®ç表æ级èå ³ç³»ï¼å¨æ们åææ¤é®é¢ä¹åï¼æ们å è¦æç½hibernateä¸ä»ä¹æ¯load,ä»ä¹æ¯getï¼å®ä»¬ä¸¤è ä¹é´æä»ä¹åºå«å¢ï¼ï¼
åªè¦ä½ å¨ä»¥å¾çå¼åè¿ç¨ä¸ç¨å 注æï¼ä¸é¾åç°ï¼åå¦æä¸¤å¼ è¡¨ï¼ä»ä»¬ä¸ºä¸å¯¹å¤å ³ç³»ï¼ç°å¨å¼å§æ¥è¯¢ï¼å¦æ使ç¨getï¼é£ä¹æ¥è¯¢çç»æå°ä¼æ¯æ2å¼ è¡¨çæ°æ®å ¨é¨æä¹ åå°å åä¸(å¦æå ³ç³»æ¯è¾æ·±ä½ è¿æç®ç¨å®åï¼)ï¼å¦ææ¯éç¨loadçæ¹å¼ï¼é£ä¹å°åªä¼æ¯æå ¶ä¸ä¸å¼ 表ï¼A表ï¼çæ°æ®å è½½å°å åä¸ï¼èå¦ä¸å¼ 表ï¼B表ï¼åªåå¨ä¸ä¸ªæ è¯ï¼ååä¸æ¯ç页é¢æ¾ç¤ºæ¶ï¼å¦æåªè¦æ¾ç¤ºA表æ°æ®ï¼é£ä¹ç¨åºç´æ¥å åä¸æ¾A表æ°æ®ï¼å¦æè¿è¦æ¾ç¤ºB表æ°æ®ï¼é£ä¹å°±è¦éè¿å åä¸B表çæ è¯éæ°æ¥æ¾æ°æ®åºï¼æ¤æ¶ï¼é®é¢åºæ¥äºï¼åå¦ä½ å¨DAOä¸ï¼session.loadä¹åä½ ç»æäºsessionççå½å¨æï¼é£ä¹å¨é¡µé¢è¦æ¾ç¤ºB表æ°æ®ï¼èB表å¨å åä¸åªæ¯ä¸ä¸ªæ è¯åï¼ä½ çsessionåå¤äºå ³éç¶æï¼å®æ æ³æ¾åï¼è¿å°±ä¼åºç°ä¸é¢ä½ éå°çé£ä¸ªé®é¢ï¼å æ¤ï¼åå¦æ们ä¸å ³ésession,页é¢å¯ä»¥æ£å¸¸æ¾ç¤º2å¼ è¡¨çæ°æ®äºï¼ä½æ¯é®é¢åæ¥äºï¼å¦æä¸å ³ésessionï¼é£ä¹å¯¹è±¡å°ä¸ç´ä»¥æä¹ æçå½¢å¼ä¿åå¨å åä¸ï¼çä¸çéæ£é¾ä»¥æ³è±¡ï¼æ¯å¦è¯¥å¯¹è±¡å®¹ææ°æ®æ··ä¹±ççï¼ï¼åä¸ä¸è¦è¯´session.clearä¹å çä¸è¥¿ä¹å¯ä»¥æ对象å游离æä¹å çè¯åï¼å¦æä½ å½»åºç¨session.clearå代session.closeçè¯ï¼å¿å¿ï¼èªå·±å»å°è¯å§ï¼å½é®é¢æ¾ç°åºæ¥çæ¶åçè¦å§^_^!好äºï¼æè¿æ¯è¯´ä¸è§£å³æ¹æ³å§~æ好çæ¹æ³å°±æ¯å°DAOä¸çsessionä¸äºç©å ¨é¨æ½ååºæ¥åæä¸ä¸ªhibernateè¿æ»¤å¨ï¼è¿æ ·æ¢è½è§£å³ä½ ä¸é¢çé®é¢ï¼åè½å¤§å¤§åå°DAOä¸ç代ç ...好å¤å¾å¤çå¦ï¼ä½¿ç¨ä¸æ¬¡ä¹å就容æä¸ç¾-_-æ空é´é好象æï¼ä½ å¯ä»¥å»çç~ç¨å¾®ä¿®æ¹å°±å¯ä»¥ç¨ï¼ï¼æ好åå·¥å ·ç±»ä¸èµ·æé 使ç¨ï¼è¶ ç½æ»´ï¼ï¼
hibernateä¸çupdateï¼ï¼ä¸saveOrUpdate()çåºå«ï¼load()ä¸get()çåºå«ï¼Hibernateä¸JPAçåºå«ã
saveOrUpdate()ä¼æ ¹æ®æç»å¯¹è±¡çidä¸åï¼æ¥éæ©ä½¿ç¨saveæè updateï¼å¦æ对象id为nullï¼å°±æ§è¡saveï¼å¦æ对象idä»æ¥æ²¡æpersistentè¿ï¼ä¹æ§è¡saveï¼å¦æ对象æ¯persistent对象çä¸ä¸ªæ°çverisonï¼é£ä¹ä¹saveï¼é¤äºä¸é¢çæ åµå ¶ä»é½æ§è¡updateï¼
load()æ¹æ³å¨ä½ æ³loadç对象ä¸åå¨æ¶ï¼ä¼throw exceptionï¼ègetæ¹æ³å°±è¿åä¸ä¸ªnullç»ä½ ï¼
hibernateæ¯å®ç°å¯¹è±¡persistenceçormçå®ç°ï¼JPAæ¯æ´ä¸ªå¯¹è±¡persistenceçè§èã
hibernate延迟加载(get和load的区别)
深入理解Hibernate的get和load加载方式一、load加载方式
1.1 延迟加载机制 当我们使用load方法加载一个对象时,Hibernate采用延迟加载机制。这意味着,当我们调用session.load()方法加载对象时,系统并不会立即执行SQL查询,获取对象数据。相反,BBOS源码加载的是一个代理对象,代理对象仅保存实体对象的id值。只有在我们需要访问对象的属性时,Hibernate才会执行SQL查询,从数据库中加载实际数据。 1.2 实例演示 示例:加载User对象 控制台输出 加载User对象时,控制台不会输出SQL查询语句,显示代理对象。访问User对象的retainall源码属性时,系统会执行SQL查询。 控制台输出 通过访问User对象的属性,系统执行SQL查询,获取完整对象。 1.3 代理对象特性 加载的对象是一个代理对象,仅保存id值。在不访问属性时,不会执行SQL查询。二、get加载方式
2.1 直接加载 使用session.get()方法加载对象时,无论是否使用该对象,系统都会执行SQL查询,从数据库中获取数据。 2.2 控制台输出 示例:通过get加载User对象,即使未使用对象,控制台会输出SQL查询语句。 2.3 性能对比 使用load加载方式比使用get性能更优,因为load加载的是代理对象,只有真正访问属性时才进行数据库查询。三、使用get和load时的小问题
3.1 使用get加载不存在对象 当使用get方法加载不存在的对象时,系统会抛出NullPointException异常。 3.2 使用load加载不存在对象 使用load加载不存在的对象时,系统会抛出ObjectNotFoundException异常。 3.3 LazyInitializationException异常 通过load加载对象后,关闭session并在后续使用对象时,可能会抛出LazyInitializationException异常。原因在于load的延迟加载机制,对象在未被使用前,没有执行SQL查询加载数据。解决方法为将load改为get,或在表示层管理session。总结
Hibernate的get和load加载方式各有特点。load采用延迟加载,适合性能敏感场景;get则直接加载对象,适合简单查询场景。理解二者区别,有助于优化数据访问和性能。2024-11-30 13:44
2024-11-30 13:10
2024-11-30 13:05
2024-11-30 13:01
2024-11-30 12:24