如何从JPA数据库实体类实现通用业务逻辑方法?

时间:2013-11-20 17:07:11

标签: java hibernate jpa ejb eclipselink

我想要一个关于我一直在考虑的情景的建议,如果可能的话。假设我有一些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操作执行相同的工作。

任何相应的例子都将受到高度赞赏。

谢谢

2 个答案:

答案 0 :(得分:1)

使用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);
    }

}

答案 1 :(得分:0)

如果您正在使用Spring,请使用Spring Data,它将为您完成所有这些。

http://docs.spring.io/spring-data/jpa/docs/1.4.2.RELEASE/reference/html/repositories.html#repositories.core-concepts