我想要一个关于我一直在考虑的情景的建议,如果可能的话。假设我有一些JPA数据库实体类,如:
@Entity
public class Person {
@Column(name = "ID")
private Long id;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
public String getFirstName(){
return this.firstName;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public String getLastName(){
return this.lastName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
}
我正在使用EJB服务。我可以使用单独的业务逻辑方法对这些实体进行CRUD操作。是否可以对这些实体类使用通用模板CRUD操作?就像我想要创建新人一样,我将提供Person实体类和字段来设置为参数,我的泛型方法将创建一个新的Person记录,并且也将为Read,Update和Delete操作执行相同的工作。
任何相应的例子都将受到高度赞赏。
谢谢
答案 0 :(得分:1)
您可以考虑服务层的抽象类:
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
}
您可以使用常见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);
}
}
答案 1 :(得分:0)
如果您正在使用Spring,请使用Spring Data,它将为您完成所有这些。