使用 JPA(休眠)从 MongoDB 加载对象
Load Object from MongoDB with JPA (hibernate)
我创建了一个 @Entity
并使用 Java Peristence API (JPA) 通过 Hibernate 将其存储在 MongoDB 中,以便能够切换到另一个 JPA 实现(如 DataNucleus、EclipseLink 等),但现在我无法再加载它了。我得到:
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.access00(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", joinColumns=@JoinColumn(name="user"))
@Getter
@Setter
private Map<<T extends Object>, Boolean> doneTask;
}
我正在使用 entityManager.find(Class<T> type, Object o)
加载对象。我可能做错了什么吗?
要使用 MongoDB,您需要
runtime "org.mongodb:mongo-java-driver:$versions.mongodb"
和您的 ogm/persitence 框架,在我的例子中是 Hibernate,与您的 framework/db 连接:
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"
和您的坚持 api(jpa、jdo 或专有的),在我的例子中是 JPA hibernate/jpa 实现:
compile "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final"
compile "$versions.persistence_api"
我创建了一个 @Entity
并使用 Java Peristence API (JPA) 通过 Hibernate 将其存储在 MongoDB 中,以便能够切换到另一个 JPA 实现(如 DataNucleus、EclipseLink 等),但现在我无法再加载它了。我得到:
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.access00(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", joinColumns=@JoinColumn(name="user"))
@Getter
@Setter
private Map<<T extends Object>, Boolean> doneTask;
}
我正在使用 entityManager.find(Class<T> type, Object o)
加载对象。我可能做错了什么吗?
要使用 MongoDB,您需要
runtime "org.mongodb:mongo-java-driver:$versions.mongodb"
和您的 ogm/persitence 框架,在我的例子中是 Hibernate,与您的 framework/db 连接:
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"
和您的坚持 api(jpa、jdo 或专有的),在我的例子中是 JPA hibernate/jpa 实现:
compile "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final"
compile "$versions.persistence_api"