package com.core.support.ejbDao;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Query;
public interface IBaseDAO<T,PK extends Serializable> {
/**
* 根据Id查找一个类型为T的对象。
* @param clazz
* @param id
* @return
*/
public T load(Serializable id);
/**
* 把实体持久化到数据库,并且使实体受到管制。
* @param t
*/
public void persist(T t);
/**
* 持久化一个对象,该对象类型为T。
* @param t
*/
public void save(T t);
/**
* 根据对象id删除一个对象,该对象类型为T
* @param t
*/
public void delete(T t);
/**
* 根据ID删除对象
* @param id
*/
public void deleteById(PK id);
/**
* 更新一个对象,主要用于更新一个在persistenceContext之外的一个对象。
*
* @param transientObject
* 需要更新的对象,该对象不需要在persistenceContext中。
*/
void update(T transientObject);
public Query createQuery(String jpql);
/**
* 根据JPQL查询总数
* @param jpql
* @return
*/
public int getTotalCount(String jpql);
/**
* 使用JPQL进行查询
* @param jpql
* @return
*/
public List<T> find(String jpql);
/**
* 单条件的JPQL查询
* @param jpql
* @param param
* @return
*/
public List<T> find(String jpql, Object param);
/**
* 多条件的JPQL查询
* @param jpql
* @param param
* @return
*/
public List<T> find(String jpql, Object... param);
/**
* 更新或添加
* @param t
*/
public void saveOrUpdate(T t);
/**
* 实体分离
*/
public void flush();
}
package com.core.support.ejbDao;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
public class BaseDAOImpl<T,PK extends Serializable> implements IBaseDAO<T,PK> {
private Class<T> clazz;
// 构造方法,根据实例类自动获取实体类类型
public BaseDAOImpl() {
this.clazz = null;
Class c = getClass();
Type t = c.getGenericSuperclass();
if (t instanceof ParameterizedType) {
Type[] p = ((ParameterizedType) t).getActualTypeArguments();
this.clazz = (Class<T>) p[0];
}
}
@PersistenceContext(unitName="OpenStarBBS")
protected EntityManager em;
public Query createQuery(String jpql) {
return em.createQuery(jpql);
}
public void delete(T t) {
em.remove(t);
}
public T load(Serializable id) {
return em.find(clazz,id);
}
@SuppressWarnings("unchecked")
public List<T> find(String jpql, Object param) {
return em.createQuery(jpql).setParameter(1, param).getResultList();
}
@SuppressWarnings("unchecked")
public List<T> find(String jpql, Object[] param) {
Query query = em.createQuery(jpql);
for (int i = 1; i <= param.length; i++) {
query.setParameter(i, param[i - 1]);
}
return query.getResultList();
}
@SuppressWarnings("unchecked")
public List<T> find(String jpql) {
return em.createQuery(jpql).getResultList();
}
@SuppressWarnings("unchecked")
public int getTotalCount(String jpql) {
return ((Long) em.createQuery(jpql).getSingleResult()).intValue();
}
public void persist(T t) {
em.persist(t);
}
public void save(T t) {
em.merge(t);
}
public void saveOrUpdate(T t) {
em.merge(t);
}
public void update(T transientObject) {
em.merge(transientObject);
}
public void deleteById(PK id) {
T object = this.load(id);
this.delete(object);
}
public void flush() {
em.flush();
}
}
以上这个可以复用。下面就是程序里的接口和类:
JAP ORM映射类
package com.openstarbbs.model;
import javax.ejb.EJB;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import com.core.support.ejbDao.IBaseDAO;
/**
* User entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "user", catalog = "openstarbbs")
public class User implements java.io.Serializable {
// Fields
private Integer id;
private String name;
private String age;
@EJB
private IBaseDAO baseDao;
// Constructors
/** default constructor */
public User() {
}
/** full constructor */
public User(String name, String age) {
this.name = name;
this.age = age;
}
public void saveUser(User user){
baseDao.save(user);
}
// Property accessors
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "name", nullable = false, length = 45)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "age", nullable = false, length = 45)
public String getAge() {
return this.age;
}
public void setAge(String age) {
this.age = age;
}
}
package com.openstarbbs.user.dao;
import javax.ejb.Stateless;
import com.core.support.ejbDao.BaseDAOImpl;
import com.openstarbbs.model.User;
@Stateless
public class UserDao extends BaseDAOImpl<User,Long> implements IUserDao{
}
package com.openstarbbs.user.dao;
import javax.ejb.Local;
import com.core.support.ejbDao.IBaseDAO;
import com.openstarbbs.model.User;
@Local
public interface IUserDao extends IBaseDAO<User,Long>{
}
package com.openstarbbs.user.service;
import javax.ejb.Remote;
import com.openstarbbs.model.User;
@Remote
public interface IUserBean {
public User getUser();
}
package com.openstarbbs.user.service;
import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import com.openstarbbs.model.User;
import com.openstarbbs.user.dao.IUserDao;
@Stateless
@Remote
public class UserBean implements IUserBean {
@EJB
private IUserDao userDao;
public User getUser() {
return userDao.load(1);
}
}