使用 EJB 和 JPA
你可以为服务层考虑一个抽象类:
public abstract class AbstractFacade<E extends Serializable,
PK extends Serializable> {
private final transient Class<E> entityClass;
public AbstractFacade(final Class<E> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(final E entity) {
final EntityManager entityManager = getEntityManager();
entityManager.persist(entity);
}
public final E find(final PK id) {
return getEntityManager().find(entityClass, id);
}
// Other common operations
}
还有一个特定的服务:
@Stateless
public class PersonFacade extends AbstractFacade<Person, Long> {
@PersistenceContext(unitName = "MyPU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public PersonFacade() {
super(Person.class);
}
// Other methods of this service
}
使用 Spring 和 Hibernate
您可以为常见的 DAO 方法创建一个抽象基类。
public abstract class AbstractDAO<E extends Serializable,
PK extends Serializable> {
private final transient Class<E> entityClass;
public AbstractDAO(final Class<E> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public final E find(final PK id) {
return getEntityManager().find(entityClass, id);
}
// Another common methods
}
在每个 DAO 实现中,您都可以为该 DAO 放置特定的方法。
@Repository
public final class PersonDAO extends AbstractDAO<Person, Long> {
@Autowired
private transient EntityManagerFactory emf;
public PersonDAO() {
super(Person.class);
}
@Override
protected EntityManager getEntityManager() {
return emf.createEntityManager();
}
// particular methods for this DAO
}
如果用户不存在怎么办?把这个逻辑放在服务层。
@Service
public final class PersonService {
private static final Logger LOG = LoggerFactory.getLogger(PersonService.class);
@Autowired
private transient PersonDAO personDAO;
public Person findPerson(final Long id) {
return personDAO.find(id);
}
}