【问题标题】:How to implement generic business logic methods from JPA database entity class?如何从 JPA 数据库实体类实现通用业务逻辑方法?
【发布时间】:2013-11-20 17:07:11
【问题描述】:

如果可能的话,我想要关于我一直在考虑做的场景的建议。假设我有一些 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 记录,并且还将为读取、更新和删除操作执行相同的工作。

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

谢谢

【问题讨论】:

  • 不客气。不要忘记,如果一个答案能令人满意地解决您的问题,您可以accept it

标签: java hibernate jpa ejb eclipselink


【解决方案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);
    }

}

【讨论】:

    【解决方案2】:

    如果您使用的是 Spring,那么请使用 Spring Data,它将为您完成所有这些工作。

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

    【讨论】:

    • 感谢您的信息。实际上我正在使用 EJB 服务。
    猜你喜欢
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多