Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate OGM和MongoDb的每类表配置不起作用_Java_Mongodb_Hibernate_Hibernate Ogm - Fatal编程技术网

Java Hibernate OGM和MongoDb的每类表配置不起作用

Java Hibernate OGM和MongoDb的每类表配置不起作用,java,mongodb,hibernate,hibernate-ogm,Java,Mongodb,Hibernate,Hibernate Ogm,我正在尝试使用HibernateOGM+MongoDb对每个类进行表配置。 我有一个BaseEntity如下: @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class BaseEntity { protected UUID id; @Id // @GeneratedValue //<--tried this only this one as we

我正在尝试使用HibernateOGM+MongoDb对每个类进行表配置。 我有一个
BaseEntity
如下:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {
    protected UUID id;

    @Id
    // @GeneratedValue  //<--tried this only this one as well
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    public UUID getId() {
        return id;
    }

    //omitted setters and other stuffs for brevity
}
当我尝试创建
EntityManagerFactory
时,如下所示:

entityManagerFactory = Persistence.createEntityManagerFactory("persistenceUnitName");
我收到以下错误:

javax.persistence.PersistenceException: [PersistenceUnit: persistenceUnitName] Unable to build Hibernate SessionFactory
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
    at org.hibernate.ogm.jpa.HibernateOgmPersistence.createEntityManagerFactory(HibernateOgmPersistence.java:59)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at service.util.HibernateOgmUtil.<clinit>(HibernateOgmUtil.java:20)
    at service.data.repositories.GenericRepository.<init>(GenericRepository.java:31)
    at service.data.repositories.QuestionRepository.<init>(QuestionRepository.java:13)
    at Playground.main(Playground.java:31)
Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: -2
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:70)
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:101)
    at org.hibernate.dialect.Dialect.getTypeName(Dialect.java:341)
    at org.hibernate.mapping.Column.getSqlType(Column.java:231)
    at org.hibernate.hql.spi.id.AbstractMultiTableBulkIdStrategyImpl.buildIdTableCreateStatement(AbstractMultiTableBulkIdStrategyImpl.java:144)
    at org.hibernate.hql.spi.id.persistent.PersistentTableBulkIdStrategy.buildIdTableInfo(PersistentTableBulkIdStrategy.java:130)
    at org.hibernate.hql.spi.id.persistent.PersistentTableBulkIdStrategy.buildIdTableInfo(PersistentTableBulkIdStrategy.java:43)
    at org.hibernate.hql.spi.id.AbstractMultiTableBulkIdStrategyImpl.prepare(AbstractMultiTableBulkIdStrategyImpl.java:84)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:453)
    at    org.hibernate.ogm.boot.impl.OgmSessionFactoryBuilderImpl.build(OgmSessionFactoryBuilderImpl.java:54)
    at org.hibernate.ogm.boot.impl.OgmSessionFactoryBuilderImpl.build(OgmSessionFactoryBuilderImpl.java:23)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
    ... 8 more
javax.persistence.PersistenceException:[PersistenceUnit:persistenceUnitName]无法构建Hibernate SessionFactory
位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954)
位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882)
在org.hibernate.jpa.HibernatePersistenceProvider.createEntityManager工厂(HibernatePersistenceProvider.java:58)
位于org.hibernate.ogm.jpa.HibernateOgmPersistence.createEntityManagerFactory(HibernateOgmPersistence.java:59)
位于javax.persistence.persistence.createEntityManagerFactory(persistence.java:55)
位于javax.persistence.persistence.createEntityManagerFactory(persistence.java:39)
位于service.util.HibernateOgmUtil.(HibernateOgmUtil.java:20)
位于service.data.repositories.GenericRepository。(GenericRepository.java:31)
位于service.data.repositories.QuestionRepository.(QuestionRepository.java:13)
在playery.main(playery.java:31)
原因:org.hibernate.MappingException:没有JDBC类型的方言映射:-2
在org.hibernate.dialogue.TypeNames.get(TypeNames.java:70)上
在org.hibernate.dialogue.TypeNames.get(TypeNames.java:101)上
位于org.hibernate.dialogue.dialogue.getTypeName(dialogue.java:341)
位于org.hibernate.mapping.Column.getSqlType(Column.java:231)
位于org.hibernate.hql.spi.id.AbstractMultiTableBulkIdStrategyImpl.buildIdTableCreateStatement(AbstractMultiTableBulkIdStrategyImpl.java:144)
位于org.hibernate.hql.spi.id.persistent.PersistentTableBulkIdStrategy.buildIdTableInfo(PersistentTableBulkIdStrategy.java:130)
位于org.hibernate.hql.spi.id.persistent.PersistentTableBulkIdStrategy.buildIdTableInfo(PersistentTableBulkIdStrategy.java:43)
位于org.hibernate.hql.spi.id.AbstractMultiTableBulkIdStrategyImpl.prepare(AbstractMultiTableBulkIdStrategyImpl.java:84)
位于org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:453)
位于org.hibernate.ogm.boot.impl.OgmSessionFactoryBuilderImpl.build(OgmSessionFactoryBuilderImpl.java:54)
位于org.hibernate.ogm.boot.impl.OgmSessionFactoryBuilderImpl.build(OgmSessionFactoryBuilderImpl.java:23)
位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
... 8个以上
当我调试时,似乎无法将
UUID
转换为等效的sql类型。但是,对
@继承(strategy=InheritanceType.TABLE\u PER\u CLASS)
进行注释后,错误消失了,但它也没有产生我想要的结果

此外,
InheritanceType.TABLE\u PER\u CLASS
给出了警告:

实体“BaseEntity”使用每个具体类的表继承,这是不可移植的,JPA提供程序可能不支持


如何为每个类的表有效地配置Hibernate OGM+MongoDb?

如果改用
@MappedSuperClass
,它将起作用

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {

...
}
我将就此提出一个问题,因为我们应该支持它,或者至少抛出一个更好的异常

或者,如果您可以更改id的类型,并且只需要将实体与MongoDB一起使用,这将起作用:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)    
   protected ObjectId id;
   ...
}

谢谢你的回答。只是一个简单的问题,当切换到ORM或其他数据存储/数据库时,这是否也起作用?不,如果切换到其他数据存储或关系数据库,ObjectId方法将不起作用。原因是ObjectId是特定的MongoDB概念,它不是JPA规范的一部分。
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)    
   protected ObjectId id;
   ...
}