Я хотел бы знать разницу между JPA и Hibernate. Я прочитал очень интересный вопрос, отправленный @Anthony с интересом, но все же я не понимаю полную картину.Реализация DAO против JPA
Я применил мое приложение в 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 - это танец и MessagingDAO танцор (Реализация).
Как @Kevin гласит:
Придумайте JPA в качестве руководящих принципов, которые должны соблюдаться или интерфейс, при реализации JPA Hibernate является код, который соответствует 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, и я обнаружил данные весны jpa для слоя интеграции. Затем я начал изучать немного больше о JPA и DAO, и возникшие выше вопросы возникли
Если я реализую данные весны jpa, могу ли я использовать MySql на данный момент и поменять его позже на другую базу данных (Cassandra, MongoDb)?
В чем разница между Spring JPA данных и Spring Data MongoDB (Первая спецификация и вторая одна реализация?)
Спасибо за вашу помощь