【问题标题】:Implementation of DAO vs JPADAO 与 JPA 的实现
【发布时间】:2015-07-30 16:51:01
【问题描述】:

我想知道 JPA 和 Hibernate 之间的区别。我感兴趣地阅读了@Anthony 发布的非常有趣的问题,但我仍然不了解全貌。

我已经在 Spring MVC 和 Hibernate 中实现了我的应用程序(见下文)。我的 DAO 是使用 HQL 查询构建的服务的实现。

@Service("messagesService")
public class MessagesService
{
    private MessagesDAO messagesDAO;

    @Autowired
    public void setMessagesDAO(MessagesDAO messagesDAO)
    {
        this.messagesDAO = messagesDAO;
    }

    public List<Message> getAllMessages()
    {
        return messagesDAO.getAllMessages();
    }
...
--------
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional
@Component("messagesDAO")
public class MessagesDAO
{
    @Autowired
    private SessionFactory sessionFactory;

    public Session session()
    {
        return sessionFactory.getCurrentSession();
    }

    @SuppressWarnings("unchecked")
    public List<Message> getAllMessages()
    {
        Criteria crit = session().createCriteria(Message.class);
        crit.createAlias("usernameSender", "u").add(Restrictions.eq("u.enabled",true));
        return crit.list();
    }
    ...

我真的很喜欢“JPA 是舞蹈,Hibernate 是舞者”的说法。但在我的具体情况下,我不完全明白为什么我的例子不是 JPA。 MessageService 是舞者,MessagesDAO 是舞者(实现)。

正如@Kevin 所说:

将 JPA 视为必须遵循的准则或接口, 而 Hibernate 的 JPA 实现是符合 API 的代码 由 JPA 规范定义并提供底层 功能。

我知道我没有将我的服务定义为接口,但这仍然让我认为我的代码符合 JPA 规范要求。

现在出现了一个问题

我的例子和宠物诊所的例子有什么区别

package org.springframework.samples.petclinic.repository;

import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.samples.petclinic.model.BaseEntity;
import org.springframework.samples.petclinic.model.Pet;
import org.springframework.samples.petclinic.model.PetType;


public interface PetRepository {

    List<PetType> findPetTypes() throws DataAccessException;

-------
@Repository
public class JpaPetRepositoryImpl implements PetRepository {

    @PersistenceContext
    private EntityManager em;

    @Override
    @SuppressWarnings("unchecked")
    public List<PetType> findPetTypes() {
        return this.em.createQuery("SELECT ptype FROM PetType ptype ORDER BY ptype.name").getResultList();
    }

我问所有这些问题的原因是因为我在我的应用程序中使用了 MySql,并且我正在考虑在未来改变它。

因此,我正在尝试构建我的实现层以避免以后出现任何问题。

我正在查看 nosql 选项,并发现了集成层的 spring data jpa。然后我开始学习更多关于 JPA 和 DAO 的知识,上面的问题突然出现了

如果我实现spring data jpa,我可以暂时使用MySql,稍后再更改为另一个数据库(Cassandra,MongoDb)吗?

Spring Data JPA和Spring Data Mongodb有什么区别 (第一个是规范,第二个是实现?)

感谢您的帮助

【问题讨论】:

    标签: spring hibernate jpa orm spring-orm


    【解决方案1】:

    保留术语:在您的 DAO 中,您无法更改舞伴。

    为什么?因为您明确地引用了 Hibernate。如果有一天你想改变舞者,你将不得不改变你的整个实现。这就是为什么你通常只使用舞蹈类 - JPASpring Data 在你的情况下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 2012-06-19
      • 2011-01-30
      • 2019-10-28
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多