- 浏览: 448700 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
g_man1990:
update config 不成功啊
build-helper-maven-plugin 配置多 source resource 文件 -
netwelfare:
文章很详细,就是太长了,读起来有点困难,倒不如写精练点,像这篇 ...
Java 基本类型 -
huyuancai1010:
function commitForm() {
var ...
加时间戳或者随机数去除js缓存 -
Smile__:
不过这个东西以前还真没研究过 。
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size -
Smile__:
想不到你也是北大青鸟的 。哈
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
The following implementation of equals, hashcode and toString is using the concept of one or more business keys defined by annotations.The annotation @BusinessKey can be applied with an include/exclude filter on field or method level.
Enumeration for include/exclude filter:
public enum Method { ALL, NONE, EQUALS, HASH_CODE, TO_STRING }
Business key annotation:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target( { ElementType.FIELD, ElementType.METHOD }) public @interface BusinessKey { Method[] include() default Method.ALL; Method[] exclude() default Method.NONE; }
Implementation of equals, hashCode and toString using cached reflection:
import java.lang.reflect.AccessibleObject; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Hashtable; import java.util.List; import java.util.Map; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; public class BeanUtils { private static Map<String, List<AccessibleObject>> cache = new Hashtable<String, List<AccessibleObject>>(); private BeanUtils() {} public static boolean equals(Object obj1, Object obj2) { if (obj1 == obj2) { return true; } if (obj2 == null || obj2.getClass() != obj1.getClass()) { return false; } EqualsBuilder builder = new EqualsBuilder(); for (AccessibleObject ao : getAccessibleObjects(obj1, 1)) { try { if (ao instanceof Field) { builder.append(((Field) ao).get(obj1), ((Field) ao).get(obj2)); } else { builder.append(((java.lang.reflect.Method) ao).invoke(obj1, (Object[]) null), ((java.lang.reflect.Method) ao).invoke(obj2, (Object[]) null)); } } catch (Exception e) {} } return builder.isEquals(); } public static int hashCode(Object obj) { HashCodeBuilder builder = new HashCodeBuilder(); for (AccessibleObject ao : getAccessibleObjects(obj, 2)) { try { if (ao instanceof Field) { builder.append(((Field) ao).get(obj)); } else { builder.append(((java.lang.reflect.Method) ao).invoke(obj, (Object[]) null)); } } catch (Exception e) {} } return builder.toHashCode(); } public static String toString(Object obj) { ToStringBuilder builder = new ToStringBuilder(obj, ToStringStyle.SHORT_PREFIX_STYLE); for (AccessibleObject ao : getAccessibleObjects(obj, 4)) { try { if (ao instanceof Field) { builder.append(((Field) ao).getName(), ((Field) ao).get(obj)); } else { builder.append(((java.lang.reflect.Method) ao).getName(), ((java.lang.reflect.Method) ao).invoke(obj, (Object[]) null)); } } catch (Exception e) {} } return builder.toString(); } private static List<AccessibleObject> getAccessibleObjects(Object obj, int filter) { Class<?> clazz = obj.getClass(); String name = clazz.getName() + filter; if (!cache.containsKey(name)) { List<AccessibleObject> aos = new ArrayList<AccessibleObject>(); do { Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { BusinessKey bk = field.getAnnotation(BusinessKey.class); if (bk != null && (filter(bk) & filter) == filter) { field.setAccessible(true); aos.add(field); } } java.lang.reflect.Method[] methods = clazz.getDeclaredMethods(); for (java.lang.reflect.Method method : methods) { BusinessKey bk = method.getAnnotation(BusinessKey.class); if (bk != null && (filter(bk) & filter) == filter) { method.setAccessible(true); aos.add(method); } } clazz = clazz.getSuperclass(); } while (clazz != null); Collections.sort(aos, new AccessibleObjectComparator()); cache.put(name, aos); } return cache.get(name); } private static int filter(BusinessKey bk) { int filter = 0; for (Method method : bk.include()) { switch (method) { case ALL: filter = filter | 7; break; case EQUALS: filter = filter | 1; break; case HASH_CODE: filter = filter | 2; break; case TO_STRING: filter = filter | 4; break; } } for (Method method : bk.exclude()) { switch (method) { case ALL: filter -= filter & 7; break; case EQUALS: filter -= filter & 1; break; case HASH_CODE: filter -= filter & 2; break; case TO_STRING: filter -= filter & 4; break; } } return filter; } private static class AccessibleObjectComparator implements Comparator<AccessibleObject> { public int compare(AccessibleObject o1, AccessibleObject o2) { boolean o1IsField = o1 instanceof Field; boolean o2IsField = o2 instanceof Field; if (!o1IsField && o2IsField) { return 1; } else if (o1IsField && !o2IsField) { return -1; } if (o1IsField) { return ((Field) o1).getName().compareTo(((Field) o2).getName()); } else { return ((java.lang.reflect.Method) o1).getName().compareTo(((java.lang.reflect.Method) o2).getName()); } } } }
Example of usage in a JPA annotated bean:
@Entity public class User { private Long id; private String username; private byte[] password; private Set<Role> roles = new TreeSet<Role>(); protected User() {} public User(String username, String password) { this.username = username; setPassword(password); } @BusinessKey(include = Method.TO_STRING) @Id @GeneratedValue public Long getId() { return id; } protected void setId(Long id) { this.id = id; } @BusinessKey @Column(nullable = false, unique = true) public String getUsername() { return username; } public User setUsername(String username) { this.username = username; return this; } @BusinessKey @Column(length = 32, nullable = false) public byte[] getPassword() { return password; } public void setPassword(String password) { try { MessageDigest md = MessageDigest.getInstance("SHA-256"); this.password = md.digest(password.getBytes()); } catch (NoSuchAlgorithmException e) {} } @ManyToMany public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } @Override public boolean equals(Object obj) { return BeanUtils.equals(this, obj); } @Override public int hashCode() { return BeanUtils.hashCode(this); } @Override public String toString() { return BeanUtils.toString(this); } }
If you don't mind to use a superclass in your beans the following superclass can be added as a convenience:
public abstract class Bean { @Override public boolean equals(Object obj) { return BeanUtils.equals(this, obj); } @Override public int hashCode() { return BeanUtils.hashCode(this); } @Override public String toString() { return BeanUtils.toString(this); } }
发表评论
-
Hibernate search
2011-02-21 14:44 3420Hibernate Search是Hibernate的子项目, ... -
SimpleJdbc
2010-05-26 17:21 1925SimpleJdbcInsert类和SimpleJdbcCal ... -
Hibernate 注解 annotation
2010-05-05 20:37 15026一、 实体 Bean 每个持久化POJO类都是一个实体Bea ... -
Hibernate 拦截器 和 监听器
2009-11-25 11:29 1875拦截器(Intercept):顾名思义,拦截操作,也就是在Hi ... -
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
2009-11-17 17:32 19922hibernate.jdbc.fetch_size 50 h ... -
Hibernate 二级缓存 和 查询缓存
2009-09-22 11:19 3066自己测试的一些结果 , ... -
get 会使用二级缓存
2009-09-03 17:17 1448经常看到session.get()和session.load( ... -
Query.list 与 Query.iterate 的区别
2009-09-03 17:08 1941list: 结果存入缓存,但不从缓存里面取;查询时属性连同id ... -
Jdbc 与 Jta 事务
2009-08-26 14:35 2665hibernate的两种事务管理jdbc 和jta方式。下边说 ... -
Hibernate Session Flush
2009-08-14 11:34 8620session flush在commit之前默 ... -
GenericSpringDAO<T extends ...>
2009-08-03 10:06 1519import java.io.Serializable;imp ... -
hibernate cascade inverse
2009-06-28 19:43 1147这两个属性都用于一多 ... -
Hibernate Criteria
2009-06-19 11:15 1064Hibernate 设计了 CriteriaSpec ... -
Hibernate的Criteria 简单用法
2009-05-26 16:52 1800在hibernate的Session里面使用createCri ... -
Hibernate中Criteria的完整用法
2009-05-26 16:46 614Criteria 在查询方法设计上可以灵活的根据 Criter ... -
Hibernate 的连接池属性简介
2009-05-07 11:30 1655Hibernate配置属性 ... -
Hibernate Inverse
2009-04-23 17:15 1276一、Inverse是hibernate双向关系中的基本概念。i ... -
hibernate的hibernate.hbm2ddl.auto属性
2009-01-06 16:33 2369<property name="hibern ... -
hibernate主键常用方式
2009-01-06 16:32 10421) assigned 主键由外部程序负责生成,无需Hibe ...
相关推荐
这里面包涵了需要用Hibernate Annotation时,所需要的所有jar包! 现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用...
hibernate annotation中文文档
《Hibernate注解与Hibernate3深度解析》 在Java开发领域,Hibernate作为一种强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本篇将深入探讨Hibernate 3版本中的注解使用,帮助开发者理解如何利用注解进行...
《Hibernate Annotation 中文文档》是Java开发者们的重要参考资料,它详细介绍了如何在Hibernate框架中使用注解进行对象关系映射(ORM)。Hibernate是一款强大的开源Java持久化框架,它简化了数据库与Java对象之间的...
在Hibernate中,注解(Annotation)是一种声明式的方法,用于配置实体类、属性以及它们与数据库表之间的映射关系。本文将深入探讨“最全的Hibernate Annotation API文档”中的关键知识点。 一、实体类(Entity) 在...
**Hibernate Annotation 中文文档** 在Java的持久化框架中,Hibernate是一个非常重要的工具,它极大地简化了数据库操作。随着技术的发展,Hibernate Annotation逐渐成为主流,因为它提供了更直观、更简洁的方式来...
Hibernate Annotation库是Java开发中用于简化对象关系映射(ORM)的一个重要组件,它使得开发者能够在Java类上直接使用注解来定义数据库映射,从而避免了传统的XML配置文件。这三个特定的jar包是Hibernate ORM框架中...
《Hibernate Annotation 学习笔记》 在Java的持久化框架中,Hibernate以其强大的功能和易用性成为开发者首选之一。而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML...
**Hibernate Annotation 入门** Hibernate 是一款非常流行的Java对象关系映射(ORM)框架,它允许开发者使用面向对象的方式操作数据库。而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上...
Hibernate Annotation
总结来说,这个 "Spring Hibernate Annotation demo" 展示了如何在 Spring 框架中使用注解配置来管理依赖,以及如何利用 Hibernate 的注解进行数据持久化。同时,它还涉及到了 Flex 前端与后端的交互。通过学习这个 ...
Hibernate Annotation API是Hibernate ORM的一种扩展,允许开发者使用Java注解(Annotations)来定义对象-关系映射。这种API避免了传统的Hibernate XML配置文件,使得ORM配置更加内聚且易于维护。 2. **核心注解**...
Hibernate annotation 3.4 api CHM
标题“Hibernate distribution and annotation”涉及到的是Hibernate ORM框架的一个特定版本及其相关的注解功能。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程模型来操作...
【标题】:深入理解Hibernate Annotation及其使用 【描述】:本文将全面介绍Hibernate Annotation的使用,包括事务管理和声明式事务处理,以及如何通过注解简化数据库持久化操作。 【标签】:Hibernate, ...
hibernate 注解 annotation 教程
### HibernateAnnotation 技术概述 在Java开发领域中,Hibernate框架是进行对象关系映射(Object-Relational Mapping,简称ORM)的一种非常流行的工具。它能够帮助开发者将面向对象的模型与关系型数据库进行桥接,...
Hibernate Annotation中文教程 Hibernate 是 Java 数据库持久性的事实标准之一,它非常强大、灵活,而且具备了优异的性能。传统上,Hibernate 的配置依赖于外部 XML 文件,而最近发布的几个 Hibernate 版本中,...