【发布时间】: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