1

プロジェクトで JPA 2.0 を使用しています。

私はエンティティ サブクラス AppEntity を持っており、AbstractEntity を拡張しています。

AbstractEntity は @MappedSuperClass でマップされます。

@Id
@Column(name ="OBJID")
private String objId;

@Column
...(other entities)
along with getters and setters for objId and other attributes.

私のサブクラス AppEntity では、すべてのセッター メソッドがオーバーライドされます。サブクラス エンティティには属性がありません (@Id / @Column マッピング)。

hibernate 4.2.6 を使用してこのアプリケーションをデプロイすると

サーバーの起動時に org.hibernate.cfg.AnnotationBinder がチェックするため、ArrayIndexOutOfBoundException が発生します。

private static PropertyData getUniqueIdPropertyFromBaseClass(
            .....
    //Id properties are on top and there is only one
            return baseClassElements.get( 0 );
}

サブクラス エンティティには属性がないため、get(0) は Outofbound 例外をスローします。

ただし、休止状態 3.5 には上記のチェックがないため、上記のコードは JPA 1.0 で機能します。

JPA 2.0 では、サブクラス エンティティに制限はありますか? AnnotationBinder.java getUniqueIdPropertyFromBaseClass メソッドで属性をチェックする背後にあるロジック。

https://github.com/hibernate/hibernate-orm/blob/4.2/hibernate-core/src/main/java/org/hibernate/cfg/AnnotationBinder.java

参照用に StackTrace を追加する

AnnotationBinder.getUniqueIdPropertyFromBaseClass(PropertyData, PropertyData, AccessType, Mappings) line: 2576  
AnnotationBinder.isIdClassPkOfTheAssociatedEntity(ElementsToProcess, XClass, PropertyData, PropertyData, AccessType, Map<XClass,InheritanceState>, Mappings) line: 925  
AnnotationBinder.mapAsIdClass(Map<XClass,InheritanceState>, InheritanceState, PersistentClass, EntityBinder, PropertyHolder, ElementsToProcess, Set<String>, Mappings) line: 824    
AnnotationBinder.bindClass(XClass, Map<XClass,InheritanceState>, Mappings) line: 671    
Configuration$MetadataSourceQueue.processAnnotatedClassesQueue() line: 3533 
Configuration$MetadataSourceQueue.processMetadata(List<MetadataSourceType>) line: 3487  
Configuration.secondPassCompile() line: 1376    
Configuration.buildSessionFactory(ServiceRegistry) line: 1777   
EntityManagerFactoryImpl.<init>(PersistenceUnitTransactionType, boolean, Class, Configuration, ServiceRegistry, String) line: 94    
Ejb3Configuration.buildEntityManagerFactory(BootstrapServiceRegistryBuilder) line: 920  
Ejb3Configuration.buildEntityManagerFactory() line: 904 
HibernatePersistence.createContainerEntityManagerFactory(PersistenceUnitInfo, Map) line: 92 
PersistenceUnitServiceImpl.createContainerEntityManagerFactory() line: 200  
PersistenceUnitServiceImpl.access$600(PersistenceUnitServiceImpl) line: 57  
PersistenceUnitServiceImpl$1.run() line: 99 
ThreadPoolExecutor$Worker.runTask(Runnable) line: 886   
ThreadPoolExecutor$Worker.run() line: 908   
JBossThread(Thread).run() line: 619 
JBossThread.run() line: 122 
4

0 に答える 0