어떤 Java ORM을 선호합니까? 그 이유는 무엇입니까? [닫은]


262

꽤 개방 된 질문입니다. 새 프로젝트를 시작하고 데이터베이스 액세스와 통합하기 위해 다른 ORM을 찾고 있습니다.

즐겨 찾기가 있습니까? 깨끗하게 유지하는 것이 좋습니까?



자바에 대한 sql2o 같은 - 플랫폼의 DB 액세스 기술의 주위에 얇은 래퍼 - 마이크로 ORMS에 살펴보세요 github.com/aaberg/sql2o .NET 또는 ServiceStack.OrmLite을 github.com/ServiceStack/ServiceStack.OrmLite
tomaszkubacki

3
5 년 이상 ORM을 사용한 후 개인적으로 선택한 것은 ORM보다 Spring JDBC이고, 두 번째로 좋은 것은 iBatis (MyBatis)입니다. 학습 곡선, 제어 및 성능 문제로 인해 최대 절전 모드를 싫어합니다.

여기에 본격적인 ORMS에 대한 대안으로 사용할 수있는 경량 JDBC 래퍼의 (또한 폐쇄) 목록입니다 : stackoverflow.com/questions/7137929/...
바드

답변:


237

ORM 사용을 중단했습니다.

그 이유는 개념에 큰 결함이 아닙니다. 최대 절전 모드가 잘 작동합니다. 대신 쿼리의 오버 헤드가 적고 많은 복잡한 논리를 큰 SQL 쿼리에 맞추고 많은 처리를 데이터베이스로 옮길 수 있습니다.

따라서 JDBC 패키지 만 사용하십시오.


81
ORM과 관련하여 동일한 이야기가 반복됩니다. ORM 관련 버그 및 비 효율성을 추적 할 때 프로젝트의 빠른 초기 초기 개발과 자원의 큰 소모. 또한 개발자가 특정 최적화 쿼리를 작성할 필요가 없다는 아이디어를 제공하는 것 같습니다.
Eelco

7
이봐, 이것이 큰 실제 프로젝트에 해당 되는가?
santiagobasulto

30
나는 동의한다. 저는 3 년 동안 ORM을 사용해 왔으며 지속성 관련 문제를 해결하는 데 시간이 얼마나 걸 렸는지 (아직도) 알 수 없습니다. 우리는 "후드"에서 발생하는 일에 대해 어떤 제어도 할 수 없으며, 구성을 너무 효율적으로 관리하기에는 너무 많으며 하나의 미치게 만드는 행동이 있습니다. 반면에 나는 주요 데이터베이스를 지원하며 차이점에 대해 걱정할 필요가 없습니다.
marcolopes

58
쿼리 / 트랜잭션의 복잡성에 따라 둘 다 사용하지 않는 이유는 무엇입니까? 그것들이 상호 배타적이지 않습니다.
수륙 양용 비행기

6
@WillSheppard 예 윌. Django ORM을 많이 사용하며 훌륭하게 작동합니다. 차이점은 파이썬 (및 펄)의 동적 특성에 있다고 생각합니다. Java에서 ORM을 사용하는 것은 쉽지 않습니다. 그러나 동적 언어에서는 실제로 표현할 수 있습니다. DSL과 같은 ORM 작업을 파이썬에 포함시키는 훌륭한 프로젝트가 있으며 훌륭합니다.
santiagobasulto

97

ORM을 갖는 것은 적은 이점으로 너무 많은 제어권을 빼앗기기 때문에 불가능합니다. ORM 사용으로 인한 이상을 디버그해야 할 때 절약되는 시간이 쉽게 사라집니다. 또한 ORM은 개발자가 SQL을 배우지 않고 관계형 데이터베이스가 작동하는 방식과이를 활용하여 이점을 얻지 못하게합니다.


4
이 진술에 동의합니다. 퍼시스턴스 코드를 작성하면 총 개발 시간이 얼마나 걸릴까요? 생각보다 10-15%
adrian.tarau

16
때에 따라 다르지. 물론 특정 종류의 데이터베이스 만 사용하는 경우 ORM을 사용하지 않아도 쉽게 벗어날 수 있습니다. 그러나 다른 종류의 데이터베이스를 지원해야 할 경우 관리가 용이하지 않을 수 있습니다.
Jason Baker

3
"ORM 사용으로 인한 이상을 디버깅해야 할 때 절약되는 시간이 쉽게 사라집니다."기술 선택을 할 때 기술 곡선이 적절한 요소 인 경우에는 해당되지 않습니다.
elsadek

7
귀하의 주장은 모든 도서관의 이용에 반대하여 제공 될 수 있습니다. ORM의 가장 큰 장점은 작업 단위, 개체 매핑, 변경 내용 추적, 지연로드, 마이그레이션 및 관계와 같은 것입니다. user.profile.givenName을 쓸 수 있고 데이터를 저장하는 데 사용 된 구조에 신경 쓰지 않는 것이 좋습니다.
Alex

1
모든 라이브러리에 사용할 수 있지만 정도에 따라 다릅니다. 일반적으로 나는 도서관 사용을 옹호합니다-왜 바퀴를 재발 명합니까? 그러나이 경우 최대 절전 모드는 대부분의 경우 너무 무거운 무게이며 더 가벼운 ORM이 더 바람직하다고 생각합니다. 내 경험은 Hibernate로 개발하고 그 내용을 철저히 배우는 몇 년간의 경험을 바탕으로합니다.
simon

92

많은 ORM이 훌륭합니다. JDBC 위에 추상화를 추가하려는 이유를 알아야합니다. 나는 당신 에게 http://www.jooq.org 를 추천 할 수 있습니다 (면책 조항 : 나는 jOOQ의 제작자 이므로이 대답은 편견입니다). jOOQ는 다음과 같은 패러다임을 수용합니다.

  • SQL은 좋은 것입니다. 많은 것들이 SQL로 아주 잘 표현 될 수 있습니다. SQL의 완전한 추상화가 필요하지 않습니다.
  • 관계형 데이터 모델은 좋은 것입니다. 지난 40 년간 최고의 데이터 모델로 입증되었습니다. XML 데이터베이스 나 진정한 객체 지향 데이터 모델이 필요하지 않습니다. 대신, 회사는 Oracle, MySQL, MSSQL, DB2 또는 기타 RDBMS의 여러 인스턴스를 실행합니다.
  • SQL에는 구조와 구문이 있습니다. JDBC에서 "낮은 수준의"문자열 연결을 사용하거나 HQL에서 "높은 수준의"문자열 연결을 사용하여 표현하면 안됩니다. 둘 다 구문 오류가 발생하기 쉽습니다.
  • 변수 쿼리는 주요 쿼리를 처리 할 때 매우 복잡한 경향이 있습니다. 그것은 추상화되어야 할 것입니다.
  • POJO는 데이터베이스 데이터를 조작하는 Java 코드를 작성할 때 유용합니다.
  • POJO는 수동으로 작성하고 유지하는 데 어려움이 있습니다. 코드 생성은 갈 길입니다. datatype-safety를 포함한 컴파일 안전 쿼리가 있습니다.
  • 데이터베이스가 우선입니다. 데이터베이스 위에있는 응용 프로그램은 시간이지나면서 변경 될 수 있지만 데이터베이스 자체는 더 오래 지속될 수 있습니다.
  • 예, 레거시 데이터베이스에 저장 프로 시저 및 사용자 정의 형식 (UDT)이 있습니다. 데이터베이스 도구가이를 지원해야합니다.

다른 좋은 ORM이 많이 있습니다. 특히 최대 절전 모드 또는 iBATIS에는 훌륭한 커뮤니티가 있습니다. 그러나 직관적이고 간단한 것을 찾고 있다면 jOOQ를 사용해보십시오. 당신은 그것을 사랑합니다! :-)

이 SQL 예를 확인하십시오.

  // Select authors with books that are sold out
  SELECT * 
    FROM T_AUTHOR a
   WHERE EXISTS (SELECT 1
                   FROM T_BOOK
                  WHERE T_BOOK.STATUS = 'SOLD OUT'
                    AND T_BOOK.AUTHOR_ID = a.ID);

그리고 그것을 jOOQ로 표현할 수있는 방법 :

  // Alias the author table
  TAuthor a = T_AUTHOR.as("a");

  // Use the aliased table in the select statement
  create.selectFrom(a)
        .whereExists(create.selectOne()
                           .from(T_BOOK)
                           .where(T_BOOK.STATUS.equal(TBookStatus.SOLD_OUT)
                           .and(T_BOOK.AUTHOR_ID.equal(a.ID))))));

1
ORM 도구는 도구를 올바르게 사용하는 것만 큼 좋습니다. ORM 도구가 매력처럼 작동하는 프로젝트가 있지만 다른 프로젝트에서는 전혀 적합하지 않습니다. 결국, 프로젝트 요구 사항에 맞는 도구를 선택하는 것은 개발 팀의 책임입니다. ORM 도구는 복잡합니다. 불행히도, 모든 개발자 중 일부만이 작동 방식을 이해하는 데 시간을 할애합니다. 나머지는 도구를 비난하고 나쁘다고 말합니다. 질문은 다음과 같습니다. 가장 많이 답한 답변이 최상의 조언을 제공합니까? > JDBC 패키지 만 사용해보십시오. 우리는 정말로 일반 JDBC를 사용하고 싶습니까?
Vlad Mihalcea

"데이터베이스가 우선입니다." 응용 프로그램에는 클라이언트가 요청하는 기능에 대한 비즈니스 규칙이 포함되어 있으며 데이터베이스를 만들도록 거의 요구하지 않습니다. 구현 중에 결정된 기술적 세부 사항입니다.
Kwebble

58

최대 절전 모드는 기본적으로 Java의 사실상 표준이며 JPA 생성의 원동력 중 하나이기 때문입니다. Spring에서 탁월한 지원을 받고 있으며 거의 ​​모든 Java 프레임 워크가이를 지원합니다. 마지막으로 GORM은 Groovy를 사용하여 동적 파인더 등을 수행하는 멋진 래퍼입니다.

심지어 .NET (NHibernate)으로 포팅되었으므로 거기에서도 사용할 수 있습니다.


4
Hib에도 투표하지만 중요한 추가 사항이 있습니다 . 실제로 JPA 구현이 Hib에 의해 제공되는 경우 에만 JPA API를 사용해야합니다 .
Vladimir Dyuzhev

52

최대 절전 모드 :

  • 안정되어 있습니다-수년간 주변에 있었고 큰 문제가 없습니다.
  • ORM 필드의 표준을 나타냅니다
  • 지시 할뿐만 아니라 표준 (JPA)을 구현합니다.
  • 인터넷에 관한 많은 정보가 있습니다. 많은 튜토리얼, 일반적인 문제 해결 방법 등이 있습니다
  • 강력합니다. 매우 복잡한 객체 모델을 관계형 모델로 변환 할 수 있습니다.
  • 그것은 모든 주요 및 중간 RDBMS를 지원합니다
  • 일단 배우면 쉽게 작업 할 수 있습니다

ORM을 사용하는 이유와시기에 대한 몇 가지 사항 :

  • 시스템의 오브젝트를 사용하여 작업합니다 (시스템이 올바르게 설계된 경우). JDBC를 사용하더라도 변환 계층을 만들어 데이터를 객체로 전송할 수 있습니다. 그러나 내 베팅은 모든 맞춤형 솔루션보다 최대 절전 모드가 번역에서 더 낫다는 것입니다.
  • 그것은 통제력을 박탈하지 않습니다. 아주 작은 세부 사항으로 사물을 제어 할 수 있으며 API에 원격 기능이없는 경우 기본 쿼리를 실행하면됩니다.
  • 중간 규모 이상의 시스템에서는 유지 관리가 가능할 경우 1 톤의 쿼리 (한 곳에 있거나 분산되어 있음)를 감당할 수 없습니다.
  • 성능이 중요하지 않은 경우. 최대 절전 모드는 성능 오버 헤드를 추가하여 일부 경우 무시할 수 없습니다.

Hibernate와 JPA를 비교할 때 Hibernate로 가고 JPA와 JDO를 비교하면 JDO로 간다! 나는 JDO를 매우 좋아하지만 Hibernate의 두 가지 기능 (JDO에서는 사용할 수 없음)을 좋아합니다. 하나는 @Filters이고 다른 하나는 버전 필드 (낙관적 잠금을 위해)를 일반 필드에 매핑 할 수 있습니다 .JDO에서는 불가능합니다. .
Amir Pashazadeh

27

MyBatis 사용을 권장 합니다. JDBC 위에 얇은 계층으로, 오브젝트를 테이블에 맵핑하고 여전히 일반 SQL을 사용하는 것이 매우 쉽고 모든 것이 제어됩니다.


10
복잡한 읽기를위한 Ibatis, 작성, 업데이트 삭제 및 간단한 읽기를위한 최대 절전 모드는 완벽한 선택입니다.
darpet

19

중간 크기의 JavaSE 애플리케이션을 작성할 때 Avaje Ebean에 대한 경험이 정말 좋았습니다 .

표준 JPA 주석을 사용하여 엔티티를 정의하지만 훨씬 더 간단한 API (No EntityManager 또는 첨부 / 분리 된 엔티티 쓰레기 없음)를 노출합니다. 또한 필요할 때 SQL 쿼리 또는 이벤트 일반 JDBC 호출을 쉽게 사용할 수 있습니다.

또한 쿼리를위한 매우 유동적이고 형식이 안전한 API가 있습니다. 다음과 같이 쓸 수 있습니다.

List<Person> boys = Ebean.find(Person.class)
                                  .where()
                                       .eq("gender", "M")
                                       .le("age", 18)
                                  .orderBy("firstName")
                                  .findList();

6
나는 조금 이상해야한다 ... 젠더 = 'M'과 firstName에 의해 주문 된 <18 세인 사람으로부터 선택 : 나) 훨씬 나아 보인다 :-)
Eelco

4
이것은 내가 자바에서 본 더 좋은 orm 중 하나입니다. 싱글 톤을 사용하기로 결정한 것은 상쾌하며 다른 것들보다 실질적인 이점을 제공합니다.
opsb

나는 당신이 유동적이 아닌 유창함 을 의미한다고 생각합니다 .
Montdidier

@opsb 기술적으로 싱글 톤이 아닌 단일 상태라고 생각합니다.
Montdidier

Avaje Ebean ORM을 시작하는 방법? 모든 비디오 자습서 ??
Avinash

11

간단하고 마술이 아니기 때문에 SimpleORM . 모든 메타 데이터 구조를 Java 코드로 정의하며 매우 유연합니다.

SimpleORM은 관계형 데이터베이스의 데이터를 메모리의 Java 객체에 매핑하여 최대 절전 모드와 유사한 기능을 제공합니다. 조회는 Java 오브젝트로 지정 될 수 있으며, 오브젝트 ID는 데이터베이스 키와 정렬되며, 오브젝트 간의 관계는 유지되며 수정 된 오브젝트는 자동으로 낙관적 잠금으로 데이터베이스에 플러시됩니다.

그러나 최대 절전 모드와 달리 SimpleORM은 복잡한 구문 분석, 바이트 코드 처리 등을 필요로하지 않는 매우 간단한 객체 구조 및 아키텍처를 사용합니다. SimpleORM은 작고 투명하며 크기가 79K 및 52K 인 두 개의 항아리에 하나의 작고 선택적인 패키지가 있습니다. 의존성 (Slf4j). (최대 절전 모드는 2400K 이상이고 약 2000K의 종속 Jar에 해당합니다.) 이는 SimpleORM을 이해하기 쉽고 기술 위험을 크게 줄입니다.


그것을 사용하지는 않았지만 ActiveObjects는 자체 웹 사이트에서 일종의 최대 절전 모드로 설명하므로 유사성이있을 수 있습니다.
압둘라 지 발리

10

Eclipse Link 는 여러 가지 이유로, 그러나 다른 메인 스트림 솔루션보다 덜 부풀어 오른 것처럼 느낍니다 (적어도 얼굴에 부풀어 오른 느낌).

오, 이클립스 링크는 JPA 2.0에 대한 참조 구현으로 선택되었습니다


5

자유 형식 SQL 쿼리의 Java 대체에 대한 우려 사항을 공유하는 동안 ORM을 비판하는 사람들은 일반적으로 응용 프로그램 디자인이 좋지 않기 때문에 그렇게하고 있다고 생각합니다.

True OOD는 클래스와 관계에 의해 주도되며 ORM은 다양한 관계 유형과 개체에 대한 일관된 매핑을 제공합니다. ORM 도구를 사용하고 ORM 프레임 워크가 지원하는 모든 쿼리 언어 (Java 표현식 트리, 쿼리 메소드, OQL 등을 포함하지만 이에 국한되지 않음)로 쿼리 쿼리 코딩을 끝내면 클래스 모델과 같은 무언가 잘못되고있는 것입니다. 대부분의 방식으로 요구 사항을 지원하지 않습니다. 깨끗한 응용 프로그램 디자인에는 실제로 응용 프로그램 수준에서 쿼리가 필요하지 않습니다. 사람들이 코드에 SQL 문자열 상수를 포함하는 데 사용 된 것과 같은 방식으로 ORM 프레임 워크를 사용하기 시작한 많은 프로젝트를 리팩토링했습니다. 결국 모든 사람이 일단 일치하면 전체 응용 프로그램이 얼마나 간단하고 유지 관리 가능한지에 대해 놀랐습니다. 사용 모델로 수업 모델을 구성하십시오. 검색 기능 등의 경우 쿼리 언어가 필요하지만 쿼리가 너무 제한되어있어 복잡한 VIEW를 작성하고 읽기 전용 영구 클래스에 매핑하는 것이 표현식을 작성하는 것보다 유지 관리하고 보는 것이 훨씬 좋습니다. 응용 프로그램 코드의 일부 쿼리 언어로. VIEW 접근법은 또한 데이터베이스 기능을 활용하며 구체화를 통해 Java 소스에있는 수기 SQL보다 성능면에서 훨씬 우수합니다. 따라서 사소한 응용 프로그램이 ORM을 사용하지 않는 이유는 없습니다. 그러나 쿼리조차도 너무 제한되어있어 복잡한 VIEW를 만들고 읽기 전용 영구 클래스에 매핑하는 것이 응용 프로그램 코드에서 일부 쿼리 언어로 식을 작성하는 것보다 유지 관리하고 보는 것이 훨씬 좋습니다. VIEW 접근법은 또한 데이터베이스 기능을 활용하며 구체화를 통해 Java 소스에있는 수기 SQL보다 성능면에서 훨씬 우수합니다. 따라서 사소한 응용 프로그램이 ORM을 사용하지 않는 이유는 없습니다. 그러나 쿼리조차도 너무 제한되어있어 복잡한 VIEW를 만들고 읽기 전용 영구 클래스에 매핑하는 것이 응용 프로그램 코드에서 일부 쿼리 언어로 식을 작성하는 것보다 유지 관리하고 보는 것이 훨씬 좋습니다. VIEW 접근법은 또한 데이터베이스 기능을 활용하며 구체화를 통해 Java 소스에있는 수기 SQL보다 성능면에서 훨씬 우수합니다. 따라서 사소한 응용 프로그램이 ORM을 사용하지 않는 이유는 없습니다.


11
RDBMS이든 NoSQL 플레이버이든 관계없이 우리와 같이 영구 저장소를 기반으로 응용 프로그램을 구축하는 경우 해당 저장소에는 자체 효율적인 액세스 방법이 있습니다. 너무 많이 추상화하려고 시도하는 것은 너무 과장된 것입니다. '진정한 OOD'에 대해 지나치게 열심 인 것은 Java로 유명한 우주 비행사 아키텍처를 얻습니다.
Eelco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.