2017-02-08 7 views
0

Я создал @Entity и сохранил его в MongoDB через Hibernate с помощью API Java Peristence (JPA), чтобы иметь возможность переключиться на другую реализацию JPA (например, DataNucleus, EclipseLink и т. Д.), но теперь я больше не могу его загрузить. Я получаю:Загрузить объект из MongoDB с JPA (спящий режим)

java.lang.NoSuchMethodError: org.hibernate.engine.internal.TwoPhaseLoad.addUninitializedEntity(Lorg/hibernate/engine/spi/EntityKey;Ljava/lang/Object;Lorg/hibernate/persister/entity/EntityPersister;Lorg/hibernate/LockMode;ZLorg/hibernate/engine/spi/SessionImplementor;)V 
    at org.hibernate.ogm.loader.impl.OgmLoader.loadFromResultSet(OgmLoader.java:1143) 
    at org.hibernate.ogm.loader.impl.OgmLoader.instanceNotYetLoaded(OgmLoader.java:1065) 
    at org.hibernate.ogm.loader.impl.OgmLoader.getRow(OgmLoader.java:959) 
    at org.hibernate.ogm.loader.impl.OgmLoader.getRowFromResultSet(OgmLoader.java:498) 
    at org.hibernate.ogm.loader.impl.OgmLoader.doQuery(OgmLoader.java:373) 
    at org.hibernate.ogm.loader.impl.OgmLoader.doQueryAndInitializeNonLazyCollections(OgmLoader.java:283) 
    at org.hibernate.ogm.loader.impl.OgmLoader.loadEntity(OgmLoader.java:201) 
    at org.hibernate.ogm.loader.impl.OgmLoader.load(OgmLoader.java:157) 
    at org.hibernate.ogm.loader.impl.OgmLoader.load(OgmLoader.java:149) 
    at org.hibernate.ogm.loader.entity.impl.DynamicBatchingEntityLoaderBuilder$DynamicBatchingEntityLoader.load(DynamicBatchingEntityLoaderBuilder.java:116) 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4002) 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121) 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1142) 
    at org.hibernate.internal.SessionImpl.access$2600(SessionImpl.java:167) 
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2762) 
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2741) 
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:978) 
    at org.hibernate.engine.spi.SessionDelegatorBaseImpl.get(SessionDelegatorBaseImpl.java:629) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1075) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1033) 
    at org.hibernate.ogm.jpa.impl.OgmEntityManager.find(OgmEntityManager.java:97) 

Все классы что-то похожее на это или используя подмножество этого:

// package and imports (lombok and jpa) 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Bla { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    @Getter 
    @Setter 
    private long id; 

    @Getter 
    @Setter 
    private <T extends Object> attribute; 

    @OneToMany 
    @Getter 
    @Setter 
    private List<<T extends Object>> list; 

    @ElementCollection 
    @JoinTable(name="TASKS", [email protected](name="user")) 
    @Getter 
    @Setter 
    private Map<<T extends Object>, Boolean> doneTask; 

} 

И я использую entityManager.find(Class<T> type, Object o) для загрузки объектов. Возможно, я что-то делаю неправильно?

+0

JPA не определяет поддержку для не РСУБД d atastores и все провайдеры, которые также допускают сохранение MongoDB, скорее всего, сохранят отношения по-разному, следовательно, вы, вероятно, не будете иметь переносимости из-за этого факта. Лучше взглянуть на то, что каждый поставщик хочет сохранить отношениями и решать на основе этого. Что касается вашей проблемы, используйте LOG. Кроме того, вы не можете иметь '@ OneToMany' в' Object' ... должно быть сущностью –

+0

@NeilStockton, объект является только общим, так как мои классы не называются Bla, все они являются сущностями. Спасибо за ваш намек, но это не решение. – camelCaseNick

+0

Что касается вашего сообщения об ошибке, то NoSuchMethodError говорит, что просто библиотеки, которые у вас есть в CLASSPATH, несовместимы ... скомпилированы с одной вещью и запускаются с другой. –

ответ

0

Для использования MongoDB вам нужно

runtime "org.mongodb:mongo-java-driver:$versions.mongodb" 

и ваши рамки OGM/persitence, в моем случае Hibernate, с подключением рамки/дб:

compile "org.hibernate.ogm:hibernate-ogm-core:$hibernate_version" 
compile "org.hibernate:hibernate-entitymanager:$hibernate_version" 
runtime "org.hibernate.ogm:hibernate-ogm-mongodb:$hibernate_version" 

и ваш persitence API (JPA, jdo или фирменный), в моем случае JPA с внедрением спящего режима/jpa:

compile "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final" 
compile "$versions.persistence_api"