Hibernate中获取ID的通用方法.doc_第1页
Hibernate中获取ID的通用方法.doc_第2页
Hibernate中获取ID的通用方法.doc_第3页
Hibernate中获取ID的通用方法.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

首先是一个工具类SpringContextTool.java,getIdValue方法原本其他工具类中的方法,挪过来放在一起说方便。虽然是JDK 1.5的编程风格,但是主要技巧同样适用于JDK 1.4。 Java代码 1.public class SpringContextTool implements ApplicationContextAware 2. 3. /*Spring应用上下文环境*/ 4. private static ApplicationContext applicationContext; 5. 6. /*实现ApplicationContextAware接口的回调方法,设置上下文环境 7. * param applicationContext 8. */ 9. public void setApplicationContext(ApplicationContext applicationContext) 10. SpringContextTool.applicationContext = applicationContext; 11. 12. 13. public static SessionFactory getSessionFactory() 14. Assert.notNull(applicationContext, applicationContext is null,请确保spring容器正常启动); 15. return (SessionFactory) applicationContext.getBean(sessionFactory); 16. 17. 18. public static ClassMetadata getClassMetadata(Class cls) 19. return getSessionFactory().getClassMetadata(cls); 20. 21. 22. /*得到一个model的id的值,可以直接获得id而不触发sql的产生,适合ManyToOne的场景 23. * param model 有可能是CGLib增强之后的对象 24. * return id 25. */ 26. public static String getIdValue(BaseModel model) 27. if (model instanceof HibernateProxy) 28. return (String) (HibernateProxy) model).getHibernateLazyInitializer().getIdentifier(); 29. 30. return (String) getClassMetadata(model.getClass().getIdentifier(model, EntityMode.POJO); 31. 32. 33. public class SpringContextTool implements ApplicationContextAware /*Spring应用上下文环境*/ private static ApplicationContext applicationContext; /*实现ApplicationContextAware接口的回调方法,设置上下文环境 * param applicationContext */ public void setApplicationContext(ApplicationContext applicationContext) SpringContextTool.applicationContext = applicationContext; public static SessionFactory getSessionFactory() Assert.notNull(applicationContext, applicationContext is null,请确保spring容器正常启动); return (SessionFactory) applicationContext.getBean(sessionFactory); public static ClassMetadata getClassMetadata(Class cls) return getSessionFactory().getClassMetadata(cls); /*得到一个model的id的值,可以直接获得id而不触发sql的产生,适合ManyToOne的场景 * param model 有可能是CGLib增强之后的对象 * return id */ public static String getIdValue(BaseModel model) if (model instanceof HibernateProxy) return (String) (HibernateProxy) model).getHibernateLazyInitializer().getIdentifier(); return (String) getClassMetadata(model.getClass().getIdentifier(model, EntityMode.POJO); 1.这里的applicationContext属性是static的,觉得奇怪吧,没办法啊,为了追求getIdValue是static的,因为Model中或者是BaseModel中实现HashCode或者是equals最好是能调用static的方法,而不是有状态的。 2.getIdValue方法中,参数model可以是Object类型,其中实现方法可以看到,如果是代理对象HibernateProxy,可直接得到他的ID,如果是非代理对象,通过配置信息一样可以得到ID。传入参数可以改成Object类型,返回类型也可以根据需要修改成Object。 下面是我写的BaseModel中的应用(注意hashCode方法的实现,我这里规定ID是String类型的,其他类型的ID一样可以借鉴),仅供参考: Java代码 1.public abstract class BaseModel implements Cloneable, Serializable 2. 3. 4. public int hashCode() 5. String idStr = SpringContextTool.getIdValue(this); 6. return idStr = null ? super.hashCode() : idStr.hashCode(); 7. 8. 9. public boolean equals(Object other) 10. if (other = null) 11. return false; 12. 13. if (other = this) 14. return true; 15. 16. /*因为字节码增强的关系,getClass()不能用作判断的依据*/ 17. if (getClass().getPackage() != other.getClass().getPackage() 18. return false; 19. 20. if (hashCode() = other.hashCode() 21. return true; 22. 23. return false; 24. 25. 26. /*日志对象*/ 27. protected final Logger log = Logger.getLogger(getClass(); 28. 29. 30. /*覆盖toString方法,ToStringStyle取值为ToStringStyle.SHORT_PREFIX_STYLE 31. * ,调试的时候注意会自动取所有引用的值,会触发所有的Hibernate的延迟加载, 32. * 如果遇到性能问题,必须覆盖这个默认的toString方法的实现,或者避免调用这个默认的toString方法。 33. * return String 34. */ 35. public String toString() 36. ToStringBuilder tsb = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE); 37. for (Field field : getClass().getDeclaredFields() 38. if (Modifier.isStatic(field.getModifiers() 39. continue; 40. 41. String name = field.getName(); 42. if (log.equals(name) | serialVersionUID.equals(name) 43. continue; 44. 45. Object obj = ModelUtils.getProperty(this, name); 46. if (obj instanceof AbstractPersistentCollection) 47. continue; 48. 49. if (obj instanceof Calendar) 50. obj = DateTimeUtils.calendar2StrDateTime(Calendar) obj); 51. 52. tsb.append(name, obj); 53. 54. return tsb.toString(); 55. 56. 57. /*提供默认的clone方法的实现,不支持深层复制 58. * return Object 59. */ 60. public E clone() 61. try 62. return (E) super.clone(); 63. catch (CloneNotSupportedException ex) 64. throw new IllegalArgumentException(ex.getMessage(); 65. 66. 67. 68. /*提供simple的clone方法的实现,不复制Hibernate代理对象 69. * return Object 70. */ 71. public Object cloneSimple() 72. Object obj = ModelUtils.newInstance(getClass(); 73. Field fields = getClass().getDeclaredFields(); 74. for (int i = 0; i fields.length; i+) 75. if (Modifier.isStatic(fields.getModifiers() 76. continue; 77. 78. String name = fields.getName(); 79. if (serialVersionUID.equals(name) 80. continue; 81. 82.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论