Table 每 class 配置 Hibernate OGM 和 MongoDb 不工作
Table per class configuration with Hibernate OGM and MongoDb is not working
我正在尝试使用 Hibernate OGM + MongoDb 根据 class 配置进行 table。
我有一个 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
}
然后我还有其他 class 继承自 BaseEntity
:
@Entity
public class OtherEntity extends BaseEntity {
}
当我尝试按如下方式创建 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
当我调试时,似乎无法将 UUID
转换为等效的 sql 类型。但是随后,评论 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
使错误消失了,但是,它也没有产生我想要的结果。
此外,InheritanceType.TABLE_PER_CLASS
给出警告:
Entity "BaseEntity" uses table-per-concrete-class inheritance which is not portable and may not be supported by the JPA provider
如何根据 class 为 table 有效配置 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;
...
}
我正在尝试使用 Hibernate OGM + MongoDb 根据 class 配置进行 table。
我有一个 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
}
然后我还有其他 class 继承自 BaseEntity
:
@Entity
public class OtherEntity extends BaseEntity {
}
当我尝试按如下方式创建 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
当我调试时,似乎无法将 UUID
转换为等效的 sql 类型。但是随后,评论 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
使错误消失了,但是,它也没有产生我想要的结果。
此外,InheritanceType.TABLE_PER_CLASS
给出警告:
Entity "BaseEntity" uses table-per-concrete-class inheritance which is not portable and may not be supported by the JPA provider
如何根据 class 为 table 有效配置 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;
...
}