2012-06-05 3 views
0

위치 모델 클래스가 있습니다. 나는 추상적 인 클래스 Persister를 가지고있다. 나는 추상 클래스 인 MySQLPersister와 MongoDBPersister의 두 가지 구현을 가지고있다. Reasoning은 내가해야 할 때마다 MySQL 또는 MongoDB를 사용하는 것을 전환 할 수 있도록합니다. 동시에 두 가지를 사용하지는 않습니다. 더 많은 유연성을 위해서.JPA와 Morphia를 사용하여 동일한 모델에 적용 할 경우 충돌 프레임이 재생됩니다.

문제가 Location 모델 클래스가 모델을 확장하면 MySQL은 play.db.jpa.Model을 가져와야합니다. MongoDB는 play.modules.morphia.Model을 가져옵니다. 이는 전환 할 때마다 위치 모델 클래스를 변경해야 할뿐만 아니라 모델에 다른 메소드가있는 두 라이브러리로 인해 Persister 구현에서 코드를 변경해야하기 때문에 문제가됩니다.

예를 들어, JPA에서 Morphia로 변경하려면 MySQLPersister에서 코드를 주석 처리해야합니다. Model.find(). fetch()는 JPA에서 Iterable을 반환하고 JPA를 가져올 때 Morphia의 Model.find(). filter(). asList()는 존재하지 않습니다.

어떻게이 문제를 극복합니까? 저는 제네릭 모델 클래스와 각 데이터베이스를 가져 오는 두 개의 동일한 모델 클래스를 만들고 싶지 않습니다. 너무 많은 중복입니다.

는 기본적으로 나는 플레이 모르핀의 디자인을 찾아 플레이 JPA unflexible : 모두 play.db.jpa.Modelplay.modules.morphia.Model 좀 더 일반화 된 Model 클래스에서 확장 된 경우가 더 좋았을 것

JPA        PlayMorphia 
play.db.jpa.Model   > play.modules.morphia.Model 
javax.persistence.Entity > com.google.code.morphia.annotations.Entity 

. 이 방법을 사용하면 두 데이터베이스를 모두 구현하려는 경우 모델을 변경하지 않아도됩니다.

감사합니다. 제 설명이 명확하지 않은지 알려주세요.

답변

0

나는 다음과 같은 솔루션을 결정했습니다위한 좋은 사용 사례되지 않습니다 :

하면 MySQLPersister 및 MongoDBPersister 및 사용 내부 위치 클래스를 만듭니다 ORM을 수행하고 데이터베이스를 쿼리 할 사람. 그런 다음 내부 위치 클래스에 의해 입력 된 결과를 일반, 프런트 엔드 방향 LocationBean으로 변환하십시오. 필자는 본질적으로 두 Persisters 내의 내부 클래스 내부에 Location 모델을 두 번 복제했습니다.

이렇게하면 데이터베이스간에 전환하고 싶다면 새로운 MySQLPersisteR() 또는 새로운 MongoDBPersister를 초기화하는 것만 변경하면됩니다. 새 데이터베이스를 구현해야한다면 LocationPersister를 ORM 용 내부 클래스로 다시 확장하면됩니다.

0

난 당신의 영속 계층 위에 또 다른 추상화 레이어를 사용하려고합니다. 추상 레이어는 애플리케이션에 대한 구현에 독립적 인 메소드를 제공해야하며, 레이어는 호출을 실제 프레임 워크 종속적 인 지속 레이어 구현 (예 : jpa.Model 또는 Morphia.model)에 위임해야합니다.

이 너무 많이 중복하지만, 객체 지향 프로그래밍 :

+0

나는 퍼시 스터가 가지고있는 추상적 인 방법을 확장하여 MySQL과 MongoDB를 지속시키는로드와 저장을위한 추상 메소드와 추상적 인 퍼시스를 가지고있다. 이 의미에서 필자는 프레임 워크 종속 계층에 대한 호출을 위임 한 계층 위에 추상 Persister 계층 - 구현 독립적입니다. 그러나 ... 이러한 호출을 위임하는 계층은 모델 자체를 복제하지 않고 수정하는 방법을 모르는 동일한 모델에 의존합니다. –

+0

다른 데이터베이스를 충족시키기 위해 모델을 복제하는 경로를 선택하면 열을 추가하거나 제거해야 할 경우 여러 파일에서 모두 변경해야합니다. 내가 생각할 수있는 다른 해결책은 ORM에 의존하지 않고 Java MongoDB 드라이버를 사용하여 객체를 쿼리하는 것입니다. –