2017-01-11 14 views
0

Hibernate OGM + MongoDbを使用してクラスごとのテーブル構成を作成しようとしています。 私は以下のようBaseEntityありますHibernate OGMとMongoDbを使用したクラス構成ごとのテーブルが正しく動作しません。

@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 
} 

をそして私はBaseEntityから継承する他のクラスがあります。私は、次のようEntityManagerFactoryを作成しようとすると

@Entity 
public class OtherEntity extends BaseEntity { 
} 

を:

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

にHibernate OGM + MongoDBのは、クラスごとのテーブルのために効果的に設定することができますか?

答えて

0

代わりに@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; 
    ... 
} 
+0

が答えてくれてありがとう。簡単な質問ですが、これはORMや別のデータストア/データベースに切り替えると機能しますか? –

+1

いいえ、別のデータストアまたはリレーショナルデータベースに切り替えると、ObjectIdのアプローチは機能しません。その理由は、ObjectIdはMongoDB固有の概念であり、JPA仕様の一部ではないためです。 – Davide

関連する問題