前段时间用hibernate的时候,看到用范型加ParameterizedType进行设计的例子,使用的比较巧。用ParameterizedType进行切面编程十分轻巧。
下面是一个利用ParameterizedType进行切面编程的例子:
例子中有一个抽象的JpaDaoImpl.java类,所以继承该类的XXXJpaDAOImpl,都对应于一个数据库表(table)。<E extends AbstractEntity, I>中的‘E’就表示该数据库表对应于Java中的entity。JpaDaoImpl类本身也implements了Dao<E, I>的接口。Dao<E, I>定义了JpaDaoImpl所需要实现的基本方法(基于数据库表的CUID方法)。
通过“(Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]”,就可以得到E在实际的XXXJpaDaoImpl.java类中是什么具体的entity。得到E,我们就可以通过hibernate实现基本的CUID操作了。
JpaDaoImpl.java类的代码
/**
*
* JPA implementation of DAO.
*
* @param <E> entity type
* @param <I> primary key type
*/
public class JpaDaoImpl<E extends AbstractEntity, I> extends JpaDaoSupport implements Dao<E, I> {
protected Class<E> entityClass;
@SuppressWarnings("unchecked")
public JpaDaoImpl() {//very tricky here
entityClass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public E create(E entity) {
getJpaTemplate().persist(entity);
return entity;
}
public void delete(E entity) {
getJpaTemplate().remove(entity);
}
public void delete(I id) {
getJpaTemplate().remove((find(id)));
}
public boolean exists(I id) {
return find(id) != null;
}
public E find(I id) {//entityClass is used
return getJpaTemplate().find(entityClass, id);
}
public E update(E entity) {
return getJpaTemplate().merge(entity);
}
public List<E> query() {//entityClass is used
return query("from " + entityClass.getSimpleName());
}
......
}
Dao<E, I>接口的定义
public interface Dao<E extends AbstractEntity, I> {
E create(E entity);
E update(E entity);
void delete(E entity);
void delete(I id);
E find(I id);
boolean exists(I id);
......
}
继承JpaDaoImpl.java类的两个具体实现,分别为User表和Privilege表提供基本的CUID操作。
public class UserDaoImpl extends JpaDaoImpl<User, Long>{
//No method needs
}
public class PrivilegeDaoImpl extends JpaDaoImpl<Privilege, String>{
//No method needs
}
Hibernate用范型和ParameterizedType进行的设计真的很轻巧,以后在其他的设计上,也要借鉴。
分享到:
相关推荐
这里我们将深入探讨四个重要的子接口:`ParameterizedType`、`GenericArrayType`、`TypeVariable`和`WildcardType`,它们都是与反射和泛型紧密相关的。 1. `ParameterizedType`接口: `ParameterizedType`表示参数...
### Java范型攻略篇:深度解析与应用 #### 一、引言:Java范型的引入 在Java的发展历程中,...在实际开发中,合理利用范型可以显著提升代码质量和维护效率,避免潜在的运行时错误,是现代Java编程不可或缺的一部分。
Parameterized Trigger Plugin 2.25 hpi
### 参数化算法(Parameterized Algorithms) #### 概述 参数化算法是一类处理难以解决的计算问题的方法。这种算法的设计思想在于将问题的复杂度与一个特定参数关联起来,而不是仅仅依赖于输入数据的大小。这种...
ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass; Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // actualTypeArguments[0] 就是 T 的实际类型 } `...
该系统提供了设计输入、综合、布局和布线、仿真、定时分析和器件编程等功能,支持多种平台和 EDA 软件。 max-plus 2 软件编程讲解的主要功能包括: * 设计输入:支持多种设计输入方式,包括图形设计输入、文本...
参数化复杂性(Parameterized Complexity)作为一种新兴且前景广阔的计算理论方法,旨在处理那些在计算领域内常常出现的NP难问题甚至更困难的问题。该理论的核心思想是通过将输入中的某些特定部分或组件识别为参数,并...
Parameterized Controller是JMeter测试工具中的一个重要组件,它在性能测试场景中扮演着关键角色。JMeter是一款开源、跨平台的负载和性能测试工具,广泛应用于Web应用的性能评估。在进行性能测试时,我们经常需要...
在运行结果中,我们可以看到,使用getType()方法只是获取到了字段score的类型是java.util.Map,但是使用ParameterizedType对象可以获取到字段score的泛型参数是String和Integer。 通过这个实例,我们可以看到,使用...
ParameterizedType type = (ParameterizedType) returnType; Type[] typeArguments = type.getActualTypeArguments(); if (index >= typeArguments.length || index ) { throw new RuntimeException("Index " + ...
How to install Run mvn clean package to create the plugin .hpi file. To install: 1. copy the resulting ./target/credentials.hpi file to the $JENKINS_HOME/plugins directory....
ParameterizedType parameterizedType = (ParameterizedType) type; Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); Class<T> entityClass = (Class) actualTypeArguments[0]; } ```...
具体来说,该函数利用了图像的熵值和边缘信息来衡量图像的质量。 ##### 2.3 避免色域问题 在增强后的彩色图像中,有时会出现色域(gamut)问题,即某些像素的颜色超出了标准的色域范围。为了解决这一问题,研究者...
接着,我们利用目标风格图像的笔触特征,通过优化过程调整这些参数化笔触,使它们匹配目标风格。在这个过程中,可微分渲染机制使得优化过程能够有效地处理笔触的几何和视觉属性,确保了风格转换的平滑和自然。 此外...
- **AOP(面向切面编程)**:Spring框架中的切面处理、动态代理都离不开反射。 - **单元测试**:JUnit等测试框架利用反射来调用私有方法或构造函数,以进行更全面的测试。 3. **注意事项**: - **安全性**:反射...
例如,Spring框架通过反射来创建和配置bean,动态代理则利用反射实现AOP(面向切面编程)。 总的来说,“反射机制例子”可能演示了如何使用这些概念,如创建对象、访问字段、调用方法等,以展示Java反射的强大功能。...
在Java编程语言中,反射机制是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。通过反射,我们可以动态地创建对象、调用方法、访问字段,甚至可以处理私有成员,这为编写更加灵活和通用的...
10. **错误处理和异常(Error Handling and Exception Handling)**:在ADO.NET编程中,需要捕获和处理可能抛出的SqlException或其他相关异常,确保程序的健壮性。 11. **数据绑定(Data Binding)**:DataSet和...