èšäºã®ç¿»èš³ã¯ãããŒãžã§ã³Hibernate 4.2.19.Finalã«é¢é£ããŠããŸã
åç« -Hibernateéçºè ããã¥ã¡ã³ã-ç« IVã ãããåŠç
次ã®ç« -Hibernateéçºè ããã¥ã¡ã³ã-第VIç« ã ãã£ãã·ã³ã°
å 容
5.1ã æããããã¯
5.1.1å°çšããŒãžã§ã³çªå·
5.1.2ã ã¿ã€ã ã¹ã¿ã³ã
5.2ã æ²èŠ³çããã¯
ããã¯ã¯ãèªã¿åãæãšäœ¿çšæãšã®éã®ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®ããŒã¿å€æŽãé²æ¢ããæ段ã§ãã
ãããã¯æŠç¥ã¯æ¥œèŠ³çãŸãã¯æ²èŠ³çã®ããããã§ãã
ããããã³ã°æŠç¥
æãã
楜芳çããã¯ã¯ãå€ãã®ãã©ã³ã¶ã¯ã·ã§ã³ãçžäºã«åœ±é¿ãäžããããšãªãå®äºããããšãã§ããããã圱é¿ãããªãœãŒã¹ããããã¯ããããšãªãå®è¡ã§ããããšã瀺åããŠããŸãã ã³ãããããåã«ãåãã©ã³ã¶ã¯ã·ã§ã³ã¯ãä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ããã®ããŒã¿ãå€æŽããŠããªãããšã確èªããŸãã ãã§ãã¯ã«ãã競åããå€æŽãæããã«ãªã£ãå Žåãã³ãããç¶æ ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ããŒã«ããã¯ãããŸãã
æ²èŠ³ç
æ²èŠ³çãªæŠç¥ã¯ã䞊åãã©ã³ã¶ã¯ã·ã§ã³ãäºãã«ç«¶åããèªã¿åãåŸã«ãªãœãŒã¹ãããã¯ããã¢ããªã±ãŒã·ã§ã³ãããŒã¿ã®äœ¿çšãçµäºããåŸã«ã®ã¿ãªãœãŒã¹ãåé€ããå¿ èŠãããããšãæå³ããŸãã
Hibernateã¯ãã¢ããªã±ãŒã·ã§ã³ã«äž¡æ¹ã®ããã¯æŠç¥ãå®è£ ããã¡ã«ããºã ãæäŸããŸãã
5.1ã æããããã¯
ã¢ããªã±ãŒã·ã§ã³ããè€æ°ã®ããŒã¿ããŒã¹ãã©ã³ã¶ã¯ã·ã§ã³ã«ãŸãããé·æéã®ãã©ã³ã¶ã¯ã·ã§ã³ãŸãã¯ãã€ã¢ãã°ã䜿çšããå ŽåãããŒãžã§ã³ä»ãããŒã¿ãä¿åã§ããŸãã ãããã£ãŠãåããšã³ãã£ãã£ã2ã€ã®ãã€ã¢ãã°ã«ãã£ãŠå€æŽãããå Žåãå€æŽãã³ãããããæåŸã®ãã€ã¢ãã°ã«ã¯ç«¶åãéç¥ãããå¥ã®ãã€ã¢ãã°ã®çµæã¯äžæžããããŸããã ãã®ã¢ãããŒãã«ãããããçšåºŠã®åé¢ãä¿èšŒãããŸãããæ¡åŒµæ§ãé«ãã Read-Often Write-Sometimesã®ç¶æ³ã§ãéåžžã«ããŸãæ©èœããŸãã
Hibernateã¯ãããŒãžã§ã³æ å ±ãä¿åããããã®2ã€ã®ç°ãªãã¡ã«ããºã ãæäŸããŸã-å°çšããŒãžã§ã³çªå·ãŸãã¯ã¿ã€ã ã¹ã¿ã³ã ã
ããŒãžã§ã³çªå·
ã¿ã€ã ã¹ã¿ã³ã
éèŠã§ã
ãã¿ããããããªããžã§ã¯ãã®ããŒãžã§ã³ãŸãã¯ã¿ã€ã ã¹ã¿ã³ãããããã£ãnullã«ããããšã¯ã§ããŸããã Hibernateã¯ãæå®ããä»ã®æªä¿åå€ *æŠç¥ã«é¢ä¿ãªãã nullã«çããããŒãžã§ã³ïŒãŸãã¯ã¿ã€ã ã¹ã¿ã³ãïŒãæã€ã€ã³ã¹ã¿ã³ã¹ãtransientãšããŠèªèããŸãã nullããŒãžã§ã³ã®ããããã£ãŸãã¯ã¿ã€ã ã¹ã¿ã³ãã宣èšãããšãHibernateã§ã®æšç§»çãªåæ¥ç¶ã®åé¡ãç°¡åã«åé¿ã§ããŸããããã¯ã å²ãåœãŠãããèå¥åãŸãã¯è€åããŒã䜿çšããå Žåã«ç¹ã«äŸ¿å©ã§ãã
* unsaved-value -IDãããŒãžã§ã³ããŸãã¯ã¿ã€ã ã¹ã¿ã³ãã䜿çšããŠæ圱ãããããããã£ã®å€ã«å¿ããŠãããŒã¿ããŒã¹ãšã®åæã®ããã®UPDATEãŸãã¯INSERTæäœãå®çŸ©ããããã®æŠç¥ïŒçŽtranslãïŒ
* unsaved-value -IDãããŒãžã§ã³ããŸãã¯ã¿ã€ã ã¹ã¿ã³ãã䜿çšããŠæ圱ãããããããã£ã®å€ã«å¿ããŠãããŒã¿ããŒã¹ãšã®åæã®ããã®UPDATEãŸãã¯INSERTæäœãå®çŸ©ããããã®æŠç¥ïŒçŽtranslãïŒ
5.1.1ã å°çšããŒãžã§ã³çªå·
楜芳çããã¯ã®ããŒãžã§ã³çªå·ã¡ã«ããºã ã¯ãããŒãžã§ã³æ³šéã«ãã£ãŠæäŸãããŸãã
äŸ5.1ã ã¢ãã¹ãã©ã¯ãç
@Entity public class Flight implements Serializable { ... @Version @Column(name="OPTLOCK") public Integer getVersion() { ... } }
ããã§ãããŒãžã§ã³ããããã£ã¯OPTLOCKåã«ãããããã ãšã³ãã£ãã£ãããŒãžã£ãŒã¯ããã䜿çšããŠç«¶åããæŽæ°ãèå¥ãã æçµã³ãããåå©æŠç¥ã«ãã£ãŠäžæžããããæŽæ°ã®æ倱ãé²ããŸãã
é©åãªUserVersionTypeãå®çŸ©ããã³å®è£ ããå ŽåãããŒãžã§ã³åã¯ã©ã®ã¿ã€ãã§ãããŸããŸãã ã
ã¢ããªã±ãŒã·ã§ã³ã¯ãHibernateã«ãã£ãŠä»å ãããããŒãžã§ã³çªå·ãå€æŽã§ããŸããã ããŒãžã§ã³çªå·ã人çºçã«å¢ããã«ã¯ãHibernate Entity Managerããã¥ã¡ã³ãã®LockModeType.OPTIMISTIC_FORCE_INCREMENTãŸãã¯LockModeType.PESSIMISTIC_FORCE_INCREMENTããããã£ã®èª¬æãåç §ããŠãã ããã ããŒãžã§ã³çªå·ãããªã¬ãŒãªã©ã®ããŒã¿ããŒã¹ã«ãã£ãŠçæãããå Žåãã¢ãããŒã·ã§ã³org.hibernate.annotations.GeneratedïŒGenerationTime.ALWAYSïŒã䜿çšããŸãã
äŸ5.2ã hbm.xmlã§ããŒãžã§ã³ããããã£ã宣èšãã
<version column="version_column" name="propertyName" type="typename" access="field|property|ClassName" unsaved-value="null|negative|undefined" generated="never|always" insert="true|false" node="element-name|@attribute-name|element/@attribute|." />
å | 説æ |
---|---|
ã³ã©ã | ããŒãžã§ã³çªå·ãé
眮ãããŠããåã®ååã
ãªãã·ã§ã³ã§ãããã©ã«ãã¯ããããã£åãšåãã§ãã |
ãåå | æ°žç¶ã¯ã©ã¹ã®ããããã£ã®ååã |
ã¿ã€ã | ããŒãžã§ã³çªå·ã®ã¿ã€ãã ãªãã·ã§ã³ã§ãããã©ã«ãã®æŽæ°ã |
ã¢ã¯ã»ã¹ | ããããã£å€ã«ã¢ã¯ã»ã¹ããããã®HibernateæŠç¥ã ãªãã·ã§ã³ãããã©ã«ãã®ãããã㣠|
æªä¿åå€ | ã€ã³ã¹ã¿ã³ã¹ãäœæãããã°ããã§ãããä¿åãããŠããªãããšã瀺ããŸãã åé¢ããããšã³ãã£ãã£ããã®æœåºïŒ detached ïŒã
ããã©ã«ãå€ã®undefinedã¯ãèå¥åããããã£ã䜿çšããªãããšã瀺ããŸãã å¿ èŠã«å¿ããŠã |
çæããã | ããŒã¿ããŒã¹ã«ãã£ãŠããŒãžã§ã³ããããã£ãçæããå¿
èŠãããããšã瀺ããŸãã
ãªãã·ã§ã³ã§ãããã©ã«ãã§ã¯æ±ºããŠãããŸããã |
æ¿å ¥ãã | SQL-insertã¹ããŒãã¡ã³ãã«ããŒãžã§ã³åãå«ãããã©ããã ããã©ã«ãã¯trueã§ãããããŒã¿ããŒã¹ã®åãããã©ã«ãå€0ã§å®çŸ©ãããŠããå Žåã¯falseã«èšå®ã§ããŸã |
5.1.2ã ã¿ã€ã ã¹ã¿ã³ã
ã¿ã€ã ã¹ã¿ã³ãã¯ãããŒãžã§ã³çªå·ãããä¿¡é Œæ§ã®äœã楜芳çããã¯ã®æ¹æ³ã§ãããã¢ããªã±ãŒã·ã§ã³ãä»ã®ç®çã§äœ¿çšããããšãã§ããŸãã DateãCalendarãªã©ã®ããããã£ã§Version泚éã䜿çšãããšãã¿ã€ã ã¹ã¿ã³ããèªåçã«äœ¿çšãããŸãã
äŸ5.3 楜芳çããã¯ã«ã¿ã€ã ã¹ã¿ã³ãã䜿çšãã
@Entity public class Flight implements Serializable { ... @Version public Date getLastUpdate() { ... } }
Hibernateã¯ãã¢ãããŒã·ã§ã³å€org.hibernate.annotations.Sourceãèªã¿åãããšã«ãããããŒã¿ããŒã¹ãŸãã¯JVMããã¿ã€ã ã¹ã¿ã³ãå€ãååŸã§ããŸãã å€ã¯org.hibernate.annotations.SourceType.DBãŸãã¯org.hibernate.annotations.SourceType.VMã®ããããã§ãã ããã©ã«ãã®åäœã¯ããŒã¿ããŒã¹ã䜿çšããããšã§ããã泚éãæå®ããªãå Žåã«ã䜿çšãããŸãã
泚éorg.hibernate.annotations.GeneratedïŒGenerationTime.ALWAYSïŒã䜿çšããå ŽåãHibernateã®ä»£ããã«ããŒã¿ããŒã¹ã«ãã£ãŠã¿ã€ã ã¹ã¿ã³ããçæããããšãã§ããŸãã
äŸ5.4 hbm.xmlã®ã¿ã€ã ã¹ã¿ã³ãèŠçŽ
<timestamp column="timestamp_column" name="propertyName" access="field|property|ClassName" unsaved-value="null|undefined" source="vm|db" generated="never|always" node="element-name|@attribute-name|element/@attribute|." />
å | 説æ |
---|---|
ã³ã©ã | ã¿ã€ã ã¹ã¿ã³ããé
眮ãããŠããåã®ååã ãªãã·ã§ã³ãããã©ã«ã
ããããã£åãšåãã |
ãåå | æ°žç¶ããããã£ã®DateåãŸãã¯Timestampåã®JavaBeansããããã£ã®ååã |
ã¢ã¯ã»ã¹ | Hibernateãããããã£ã®å€ã«ã¢ã¯ã»ã¹ããããã«äœ¿çšããæŠç¥ã
ãªãã·ã§ã³ã®ããã©ã«ãã®ããããã£ã |
æªä¿åå€ | ã€ã³ã¹ã¿ã³ã¹ãäœæãããã°ããã§ãããä¿åãããŠããªãããšã瀺ããŸãã ãã€ã©ã€ã
åãé¢ããããšã³ãã£ãã£ããïŒåãé¢ãããïŒã ããã©ã«ãå€ãæªå®çŸ©ã¯ã瀺ããŸã èå¥åããããã£ã¯äœ¿çšããªãã§ãã ããã å¿ èŠã«å¿ããŠã |
ãœãŒã¹ | HibernateãããŒã¿ããŒã¹ãŸãã¯çŸåšã®JVMããã©ãã«ãååŸãããã©ããã Hibernateã¯å¢åã決å®ããããã«æ¯åããŒã¿ããŒã¹ãç
§äŒããå¿
èŠããããããDBã¿ã°ã¯äœåãªãªãŒããŒãããããããããŸãã
ãã ããdbã¿ã°ã¯ã ã¯ã©ã¹ã¿ãŒç°å¢ã ãã¹ãŠã®ããŒã¿ããŒã¹æ¹èšãããŒã¿ããŒã¹ããã®çŸåšã®ã¿ã€ã ã¹ã¿ã³ãã®æœåºããµããŒãããŠããããã§ã¯ãããŸããã ä»ã®ãã®ã¯ã粟床ãäžè¶³ããŠãããããããã¯ã«å¯ŸããŠå®å šã§ã¯ãªãå ŽåããããŸãã |
çæããã | ããŒã¿ããŒã¹ã«ãã£ãŠã©ãã«ãçæããããã©ããã ãªãã·ã§ã³ã§ãããã©ã«ãã§ã¯æ±ºããŠãããŸããã |
5.2ã æ²èŠ³çããã¯
LockModeã¯ã©ã¹ã¯ãHibernateããã£ããã£ã§ããããŸããŸãªã¬ãã«ã®ããã¯ãå®çŸ©ããŸãã
- LockMode.WRITE
Hibernateãè¡ãæŽæ°ãŸãã¯æ¿å ¥ãããšèªåçã«ãã£ããã£ãããŸãã - LockMode.UPGRADE
ãã®æ§æããµããŒãããããŒã¿ããŒã¹ã§SELECT ... FOR UPDATEã䜿çšããæ瀺çãªãŠãŒã¶ãŒèŠæ±ã®åŸã«ãã£ããã£ãããŸãã - LockMode.UPGRADE_NOWAIT
Oracleã®SELECT ... FOR UPDATE NOWAITã䜿çšããæ瀺çãªãŠãŒã¶ãŒèŠæ±åŸã«ãã£ãã㣠- LockMode.READ
HibernateãRepeatable ReadãŸãã¯Serializableã®åé¢ã¬ãã«ã§ããŒã¿ãèªã¿åããšãã«èªåçã«ãã£ããã£ãããŸãã æ瀺çãªãŠãŒã¶ãŒãªã¯ãšã¹ãã«ãã£ãŠåååŸãããå ŽåããããŸãã - LockMode.NONE
ããããã³ã°ã®æ¬ åŠã ãã¹ãŠã®ãªããžã§ã¯ãã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®çµäºæã«ãã®ããã¯ã¢ãŒãã«åãæ¿ãããŸãã ã»ãã·ã§ã³é¢é£ãªããžã§ã¯ã
updateïŒïŒãŸãã¯saveOrUpdateã®åŒã³åºãã«ãã£ãŠãããã®ã¢ãŒãã§éå§ãããŸãã
äžèšã®æ瀺çãªãŠãŒã¶ãŒèŠæ±ã¯ã次ã®ããããã®çµæãšããŠçºçããŸãã
- Session.loadïŒïŒåŒã³åºãã LockModeã瀺ã
- Session.lockïŒïŒãåŒã³åºããŸã
- Query.setLockModeïŒïŒãåŒã³åºããŸã
UPGRADEãŸãã¯UPGRADE_NOWAITãªãã·ã§ã³ãæå®ããŠSession.loadïŒïŒãåŒã³åºããèŠæ±ããããªããžã§ã¯ããã»ãã·ã§ã³ã«ãã£ãŠãŸã ããŒããããŠããªãå Žåããªããžã§ã¯ãã¯SELECT ... FOR UPDATEã䜿çšããŠããŒããããŸãã æ¢ã«ããŒããããŠãããªããžã§ã¯ãã«å¯ŸããŠloadïŒïŒãåŒã³åºããå ŽåãèŠæ±ããããã¯ã»ã©å³å¯ã§ã¯ãããŸããããHibernateã¯ãã®ãªããžã§ã¯ãã«å¯ŸããŠlockïŒïŒãåŒã³åºããŸãã
Session.lockïŒïŒã¯ãREADãUPGRADEããŸãã¯UPGRADE_NOWAITã¢ãŒãã§ããŒãžã§ã³çªå·ããã§ãã¯ããŸãã UPGRADEãŸãã¯UPGRADE_NOWAITã®å Žåãæ§æã¯SELECT ... FOR UPDATEã«ãªããŸãã
èŠæ±ãããããã¯ã¢ãŒããããŒã¿ããŒã¹ã§ãµããŒããããŠããªãå ŽåãHibernateã¯äŸå€ãã¹ããŒãã代ããã«é©åãªä»£æ¿ã¢ãŒãã䜿çšããŸãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã®ç§»æ€æ§ã確ä¿ãããŸãã