- 浏览: 443674 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 3390Hibernate Search是Hibernate的子项目, ... -
SimpleJdbc
2010-05-26 17:21 1907SimpleJdbcInsert类和SimpleJdbcCal ... -
Hibernate 注解 annotation
2010-05-05 20:37 14999一、 实体 Bean 每个持久化POJO类都是一个实体Bea ... -
Hibernate 拦截器 和 监听器
2009-11-25 11:29 1846拦截器(Intercept):顾名思义,拦截操作,也就是在Hi ... -
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
2009-11-17 17:32 19861hibernate.jdbc.fetch_size 50 h ... -
Hibernate 二级缓存 和 查询缓存
2009-09-22 11:19 3037自己测试的一些结果 , ... -
get 会使用二级缓存
2009-09-03 17:17 1425经常看到session.get()和session.load( ... -
Query.list 与 Query.iterate 的区别
2009-09-03 17:08 1911list: 结果存入缓存,但不从缓存里面取;查询时属性连同id ... -
Jdbc 与 Jta 事务
2009-08-26 14:35 2642hibernate的两种事务管理jdbc 和jta方式。下边说 ... -
Hibernate Session Flush
2009-08-14 11:34 8574session flush在commit之前默 ... -
GenericSpringDAO<T extends ...>
2009-08-03 10:06 1497import java.io.Serializable;imp ... -
hibernate cascade inverse
2009-06-28 19:43 1117这两个属性都用于一多 ... -
Hibernate Criteria
2009-06-19 11:15 1045Hibernate 设计了 CriteriaSpec ... -
Hibernate的Criteria 简单用法
2009-05-26 16:52 1767在hibernate的Session里面使用createCri ... -
Hibernate中Criteria的完整用法
2009-05-26 16:46 589Criteria 在查询方法设计上可以灵活的根据 Criter ... -
Hibernate 的连接池属性简介
2009-05-07 11:30 1630Hibernate配置属性 ... -
Hibernate Inverse
2009-04-23 17:15 1261一、Inverse是hibernate双向关系中的基本概念。i ... -
hibernate的hibernate.hbm2ddl.auto属性
2009-01-06 16:33 2334<property name="hibern ... -
hibernate主键常用方式
2009-01-06 16:32 10131) assigned 主键由外部程序负责生成,无需Hibe ...
相关推荐
hibernate annotation hibernate3
这里面包涵了需要用Hibernate Annotation时,所需要的所有jar包! 现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用...
hibernate annotation中文文档
hibernate annotation 中文文档
很全的Hibernate Annotation API文档,页面也很漂亮,太强大了。真的很实用!我以前找了好多,都不全,这个真的很不错,推荐一下。
hibernate annotation库所需要引入的三个jar包。
通过HibernateAnnotation技术就不用xml文件了
该zip包含 hibernate3.3.2相关jar与文档,hibernate annotation3.3.4相关jar与文档。
Hibernate Annotation
逐渐的Hibernate Annotation的映射方式也越来越盛行,相信过不了多久有可能会取代*.hbm.xml映射方式
学习JPA——Hibernate_Annotation使用实例学习JPA——Hibernate_Annotation使用实例学习JPA——Hibernate_Annotation使用实例
Hibernate annotation 3.4 api CHM
hibernate annotation3.3 api 文档
java SSH项目 hibernate annotation
hibernate 注解 annotation 教程
springmvc + hibernate annotation 配置
hibernate annotation spring 中文参考文档
hibernate annotation学习文档,帮助你学习hibernate
一步步hibernate annotation练习笔记, 实例操作,从经验中学习
简介: 在过去几年里,Hibernate不断发展,...Hibernate annotation使用了ejb JPA的注解,所以,下面安装配置hibernate annotation环境时,需要导入ejb的包。许多网上的资料都是jpa hibernate annotation方面的资料。