Hibernate VS JPA

Hibernate JPA
One-To-One 연관 맵핑에서 공유하는 주키의 자동 생성을 지원한다. 표준화 된 One-To-One 맵핑을 지원한다. 하이버네이트 확장을 이용하면 공유하는 주키를자동 생성할 수 있다.
하이버네이트는 모든 엔티티 연관 맵핑을 Join Table로 할 수 있다. 표준화된 연관 맵핑은 2차 테이블을 사용해서 가능하다.
하이버네이트는 인덱스를 가진 엔티티 리스트를 맵핑할 수 있다. 하이버네이트 확장 애노테이션이 있어야 가능하다.
하이버네이트는 모든 경우에 다형적인 연관을 지원한다. Table Per Concrete Class With Implicit Polymorphism은 빼고는 전부 지원한다.

Hibernate VS JPA

Hibetnate JPA
Entity와 Value-type 개념은 rich and fine-grained domain model을 지원하기 위한 필수 요소다. Value-type을 embeddable classes 라고 부른다. nonportable.
10가지나 되는 식별자 생성기 제공한다. 4가지만 지원한다. 벤더가 확장할 수 있도록 지원한다.
필드, Accessor 메소드, PropertyAccessor 인터페이스 구현체를 통해서 접근 가능하다. 혼용할 수 있다. 속성이나, Accessor 메소드로 접근할 수 있는데, 하이버네이트 애노테이션 없이 혼용할 수는 없다.
formula와 DB가 생성한 값을 사용할 수 있다. JPA에는 이런 거 없다. 하이버가 필요하다.

Hibernate Core와 Java Persistence and EJB 3.0

Hibernate Core Java Persistence and EJB 3.0
Persistence 클래스는 프록시 기반의 Lazy Loading을 사용할 때에만 아규먼트가 없는 public 또는 protected의 생성자를 필요로 한다. JPA는 모든 Entity 클래스들이 반드시 아규먼트가 없는 public 또는 protected의 생성자를 가지고 있어야만 한다.
Persistent 콜렉션은 반드시 인터페이스 타입이어야 하며, JDK가 제공하는 모든 인터페이스를 지원한다. 마찬가지로 모두 인터페이스 타입이어야 하며, 정렬된 콜렉션을 제외한 일부 인터페이스만 완전히 이식가능한 형태로 사용할 수 있다.
Persistent 속성들은 실행시에 accessor나 필드를 통해서 접근할 수 있으며, 혹은 완전히 다른 전략을 적용할 수도 있다. 마찬가지로 accessor나 필드를 통해서 접근가능하지만, 이식성이 필수라면 두 방법 모두 그렇치 않다.
XML 메타데이터 형식으로 모든 하이버네이트 맵핑 옵션을 사용할 수 있다. JPA 애노테이션은 기본적이고 가장 발전된 형태의 맵핑 옵션을 모두 제공한다. 하이버네이트 애노테이션은 별도의 맵핑과 튜닝을 필요로 한다.
XML 맵핑 메타데이터는 전역적으로 설정될 수 있으며 XML placeholder를 사용해서 메타데이터를 독립적으로 유지할 수 있다. 전역적인 메타데이터는 org.xml 메타데이터 파일에 두어야 이식성을 유지할 수 있다.