2015-07-30 6 views
0

Я хотел бы знать разницу между 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 (Первая спецификация и вторая одна реализация?)

Спасибо за вашу помощь

ответ

2

Чтобы сохранить терминологию: В ваш DAO вы не можете изменить своего партнера по танцам.

Почему? Потому что вы ссылаетесь на Hibernate явно. Если вы захотите однажды изменить танцовщицу, вам придется изменить всю свою реализацию. Вот почему вы обычно используете только классы танца - JPA или Данные весны в вашем случае.

 Смежные вопросы

  • Нет связанных вопросов^_^