2012-11-30 2 views
0

나는 JPA와 Hibernate Search가 데이터 쿼리를 위해 사용하는 접근법에 대한 정보를 찾으려 노력하고있다. 방대한 양의 데이터가 있지만 대부분은 전부는 아니지만 매우 높은 수준의 용어를 포함합니다. 나는 그들 사이의 차이를 이해하기 위해 고심하고있다. 누군가가 더 간단한 방법으로 두 가지를 설명하는 것을 가르쳐 준다면 좋을 것입니다. 나는 자바 (그러나 전에는 자바로 데이터베이스를 사용하지 않았다)와 PHP 배경 (PHP로 사용 된 데이터베이스)에서 왔습니다.JPA와 Hibernate Search의 접근 방식은 무엇입니까?

건배

답변

3

JPA는 관계형 데이터베이스에 액세스하기위한 표준 API이다. ORM : 객체 관계형 매퍼입니다. 행과 열 대신 데이터베이스에서 개체 그래프를 가져 오거나 저장할 수 있습니다.

Hibernate는 JPA API의 구현입니다.

최대 절전 모드 검색은 데이터베이스에 유지되는 개체 (또는 개체의 일부)에 대해 전체 텍스트 쿼리를 실행할 수 있도록 최대 절전 모드로 연결됩니다. 목표는 기존 SQL 쿼리 대신 (또는 추가적으로) Google과 유사한 쿼리를 실행할 수 있도록하는 것입니다.

최대 절전 모드 검색은 장면 뒤에서 Lucene을 사용합니다.

+0

그게 내가 얻지 못하는 이유입니다. JPA가 구현이 아니라면 무엇입니까? 그들이 그것이 단지 명세라고 말할 때 그들이 의미하는 것은 무엇입니까? –

+1

이것은 일련의 인터페이스이며,이 인터페이스가 수행해야하는 작업과 방법을 지정합니다. Hibernate는 인터페이스를 구현한다. 다른 모든 JEE API에서도 마찬가지입니다. Servlet/JSP는 Tomcat 및 다른 웹 컨테이너에서 구현되고, JDBC는 다양한 데이터베이스 JDBC 드라이버 등으로 구현됩니다. –

1

글쎄, 그것들은 기본적으로 SQL 상단에 멋진 래퍼/추상화가 둘 다 있습니다.

  • 처음에는 직접적인 SQL 쿼리가 거의 숨겨져 있고 상위 레벨 (그러나 synthax의 SQL과 유사 함) 언어가 두 프레임 워크에서 모두 공개됩니다. 이는 주로 응용 프로그램이 다른 데이터베이스 벤더에 의해 구현 된 SQL의 다양한 기능과 독립적으로 이루어 지도록하기위한 것입니다. JQuery DOM 조작 API를 표준 (및 브라우저 특정) 순수 자바 스크립트보다 생각하십시오. 이 언어 추상화는 Hibernate에서 HQL (Hibernate Query Language), JPA에서 JPQL (Java Persistence Query Language)로 불린다. 그것들은 모두 매우 유사하며 사실 JPQL은 HQL에 크게 영향을 받았다고 생각합니다. HQL

    SELECT p FROM Person p 
    

    과에 :

    SELECT * FROM Persons 
    

    같이 JPQL으로 표현 될 수있다 같은

SQL 쿼리 :

FROM Person p 

이 분명히 더있을 여기에 기본 예제 그것보다 그것과 그 프레임 워크가 그들의 glo와 같은 사실 때문에 bal 이름에서 알 수 있듯이 관계형 데이터를 객체에 매핑하려고하면 객체의 상위 쿼리 언어가 객체에서 작동합니다. 제 생각에 중요한 점은, JPA 나 Hibernate로 작성한 쿼리 코드가 현재 데이터베이스에 특정한 SQL로 변환되어 실행된다는 것입니다. 그리고 Hibernate (그 자체와 JPA 구현 모두)는 생성 된 모든 SQL을 로그 할 수있는 좋은 기능을 가지고있다. Hibernate 설정에서 "hibernate.show_sql"(그리고 아마도 "hibernate.format_sql") config 매개 변수를 true로 추가하십시오. 하이버 네이트-JPA 프로젝트 예를 들어, 다음과 같이 당신의 persistence.xml 파일에, 당신의 영속 단위 선언에 무언가를 추가해야합니다

<persistence> 

    <persistence-unit name="some_name"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <!-...-> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.format_sql" value="true" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

이 기능을 활성화 시도하고 JPQL 또는 HQL 중 함께 놀러 SQL 수준에서 실제로 어떤 일이 일어나는지 확인하십시오.이것은 상위 수준의 API가 어떻게 작동하는지 더 잘 이해할 수 있습니다.

  • 현재 JPA (버전 2 기준)와 마찬가지로 Hibernate는 Criteria API라고하는 데이터를 쿼리하기위한 또 다른 추상화 API를 제공합니다. 여기서 기본적인 개념은 SQL과 같은 문법 (그리고 패러다임)을 완전히 객체 지향 쿼리 (Object-Oriented Query) API로 보완한다는 것입니다. 다음은 빠른 JPA 예제입니다.

    CriteriaQuery cq = cb.createQuery (Person.class);

    Root<Person> fromPerson = cq.from(Person.class); 
    CriteriaQuery<Person> selectFromPerson = cq.select(fromPerson); 
    

그래, 그것은 이상한 보이지만, 그것의 사용은

(동적 또는 설정되지 않을 수있는 몇 가지 런타임 인수를 기반으로 쿼리 등을 만들려고 상상)이있다 다시 말하지만, 순수 Hibernate와 Hibernate JPA는 모두이 API와 매우 유사한 구현을 가지고있다. Ang 또한이 방법으로 쿼리를 작성하여 SQL로 변환하면 로그하고 조사 할 수 있습니다.

먼저 Hibernate가 있었다 : 여기에 이야기 이는 JPA와 최대 절전 모드와 관련하여 질문 사항에 따라

. 독립 실행 형 타사 프레임 워크로 SQL 데이터를 Java 클래스 및 객체에 매핑하는 방법을 제공합니다. 그런 다음 Java EE 팀원들은 이것이 좋은 생각이라고 생각하고 JPA라는 자체 버전을 만들었습니다. 이 사람들은 단지 스펙을 작성하고 제 3자가 실제 스펙을 구현할 수 있도록하는 철학을 고수하고 있기 때문에 JPA 자체만으로도 많은 인터페이스와 긴 문서가 될 것입니다 (JPA 2.0의 경우 here을 확인하십시오).). 그래서이 모든 일이 끝난 후에 JPA 스펙을 구현하기로 결정한 잠재적 제 3 자 중 하나가 최대 절전 모드였습니다. 그리고 JPA 스펙은 이미 존재하는 (그리고 완전히 구현 된) Hibernate 프레임 워크와 매우 유사하기 때문에 그들은 Hibernate 측면에서 그것을 구축하기로 결정했다. 따라서 Hibernate 프레임 워크에는 원래의 Hibernate API와 구현 (JPA 스펙과 아무 관계가 없음) 및 JPA 구현이 모두 있습니다. 같은 시간에 두 가지를 모두 사용할 수도 있습니다.하지만 실제로는 좋지 않습니다.

이제 오라클 자바 개발자는 스펙을 완료 한 후에도 이러한 구현을 수행했습니다. 이들은 대부분의 스펙 API에서이를 수행하는 경향이 있습니다. 이 구현을 EclipseLink라고하며, 이것을 here에서 확인할 수 있습니다. 이론적으로 JPA 프로젝트는 Hibernate-JPA 구현 라이브러리를 EclipseLink-JPA 구현 라이브러리로 전환하면 똑같이 작동해야한다. 실제로는 작은 차이가 있습니다.

관련 문제