如果用过EJB3的人,肯定也知道EJB3有一个EntityManager的类,如下代码
@Stateless
@Remote({TestRemote.class})
@RemoteBinding(jndiBinding="TestSessionBeanRemote")
@Local({TestLocal.class})
@LocalBinding(jndiBinding="TestSessionBeanLocal")
public class TestSessionBean implements TestRemote, TestLocal
{
@PersistenceContext(unitName="test")
private EntityManager entityManager;
public void test()
{
}
}
以我的理解,这个EntityManager就是EJB3进行实体Bean持久化相关的操作类,它有着EJB3进行持久化操作的所有方法,如查找实体find方法, 实体更新或插入merge方法, 实体移除remove方法,还有就是创建HQL查询的createQuery方法等等等等。
其中find方法用得很多,其中find方法的api定义为
|
<T> T
find(Class<T> entityClass, Object primaryKey)
Find by primary key.
它的作用是,用primary key查找实体Bean,你传一个实体Bean的Class和它的primary key进去,然后马上可以得到这个实体Bean类,多方便,不用超超类Object进行返回,不用进行Case强转,方便,也不容易出错。
但实体Bean都是自己写的,众多不同的实体Bean都有自己的类,怎么才能让这个find能够共用呢?我们可以看到它出现了<T> T之类的,那么,这个T倒底是什么呢?它就是范型了。关于JAVA范型,大家可以参考我在此篇文章之前发布的另外一篇文章“JAVA范型攻略篇”,是一篇从网上转载下来的文章,写得挺详细的,有很多例码,大家可以去看一下。
那么现在我们就照着EntityManager find方法的API定义,写一个测试吧.
public <T> T find(Class<T> entityClass, Object primaryKey)
{
//下面我只是简单地用影射模拟返回
Object object = Class.forName(entityClass.getName()).newInstance();
//中间还有一堆用影射设值的,这里我就不详谈了,大家有空多看看JAVA影射方面的知识吧
return (T) object;
}
OK,大功告成