2017-05-20 66 views
0

我已經定義了一個InheritanceType.JOINED從一對夫婦更多的類繼承的類:無法建立的Hibernate SessionFactory的時候使用連接繼承

BaseClass的

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "DISCRIMINATOR") 
@Table(name = "BASE_CLASSES", uniqueConstraints = 
@UniqueConstraint(columnNames = { "DISCRIMINATOR", "NAME" })) 
@Cacheable 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class BaseClass implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "ID") 
protected Long id; 

@Length(max = 60) 
@NotNull 
@Column(name = "NAME", nullable = false) 
private String name; 
/* Getters and setters omitted for brevity */ 

此類僅此一項造成任何問題時,試圖用Spring Boot運行該應用程序。但是,如果我添加了另外兩個類:

SubClass1

@Entity 
@Table(name = "SUB_CLASS_1") 
@DiscriminatorValue("SC1") 
@Cacheable 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class SubClass1 extends BaseClass { 

private static final long serialVersionUID = 1L; 

@OneToMany(mappedBy = "subClass1", fetch = FetchType.LAZY) 
private Set<SubClass2> subClass2s; 

SubClass2

@Entity 
@Table(name = "SUB_CLASS_2") 
@DiscriminatorValue("SC2") 
@Cacheable 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class SubClass2 extends BaseClass { 

private static final long serialVersionUID = 1L; 

@JoinColumn(name = "SUB_CLASS_1_ID", nullable = true) 
@ManyToOne(fetch = FetchType.LAZY, optional = true) 
private SubClass1 subClass1; 

我得到以下錯誤:org.hibernate.AssertionFailure: Table example.BASE_CLASSES not found。我可以運行我的測試套件(使用基於Unitils的自定義庫)就好了,但是應用程序不會啓動,而是使用相同類型的錯誤。正因爲如此,我認爲這個錯誤可能與我配置實體管理器工廠的方式有關。我在下面包含完整的堆棧跟蹤和配置類。

完整的堆棧跟蹤是:

12:24:15.278 [main] WARN net.sf.ehcache.config.ConfigurationFactory - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/C:/Users/crodriguez/.m2/repository/net/sf/ehcache/ehcache-core/2.4.3/ehcache-core-2.4.3.jar!/ehcache-failsafe.xml  
12:24:15.470 [main] ERROR org.hibernate.AssertionFailure - HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: Table example.BASE_CLASSES not found  
12:24:15.470 [main] WARN org.springframework.context.annotation.AnnotationConfigApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'exampleEntityManagerFactory' defined in class path resource [com/example/demo/configuration/JPAConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: persistence-unit] Unable to build Hibernate SessionFactory  
12:24:15.500 [main] ERROR org.springframework.boot.SpringApplication - Application startup failed  
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'exampleEntityManagerFactory' defined in class path resource [com/example/demo/configuration/JPAConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: persistence-unit] Unable to build Hibernate SessionFactory  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)  
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)  
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)  
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)  
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)  
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076)  
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:851)  
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)  
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)  
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)  
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)  
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)  
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)  
    at com.example.demo.JoinedInheritanceErrorDemoApplication.main(JoinedInheritanceErrorDemoApplication.java:10)  
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: persistence-unit] 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.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)  
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)  
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373)  
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362)  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642)  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579)  
    ... 15 common frames omitted  
Caused by: org.hibernate.MappingException: Could not instantiate persister org.hibernate.persister.entity.JoinedSubclassEntityPersister  
    at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:112)  
    at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)  
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:348)  
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)  
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)  
    ... 21 common frames omitted  
Caused by: org.hibernate.AssertionFailure: Table example.BASE_CLASSES not found  
    at org.hibernate.persister.entity.AbstractEntityPersister.getTableId(AbstractEntityPersister.java:5118)  
    at org.hibernate.persister.entity.JoinedSubclassEntityPersister.<init>(JoinedSubclassEntityPersister.java:433)  
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)  
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)  
    at java.lang.reflect.Constructor.newInstance(Unknown Source)  
    at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96)  
    ... 25 common frames omitted  

我的配置類是:

@Configuration  
@ComponentScan(basePackages = { "com.example.demo" })  
@EnableJpaRepositories(basePackages = {  
     "com.example.demo" }, entityManagerFactoryRef = JPAConfiguration.ENTITY_MANAGER_NAME, transactionManagerRef = JPAConfiguration.TRANSACTION_MANAGER_NAME)  
@PropertySource("classpath:database.properties")  
public class JPAConfiguration {  

    public static final String ENTITY_MANAGER_NAME = "entityManagerFactory";  
    public static final String TRANSACTION_MANAGER_NAME = "transactionManager";  
    public static final String PERSITENCE_UNIT_NAME = "persistence-unit";  

    private @Value("${example.datasource.url}") String datasourceUrl;  
    private @Value("${example.datasource.username}") String username;  
    private @Value("${example.datasource.password}") String password;  
    private @Value("${example.datasource.driverClassName}") String driverClassName;  
    private @Value("${example.datasource.max-active}") Integer maxActive;  
    private @Value("${example.datasource.max-idle}") Integer maxIdle;  
    private @Value("${example.datasource.min-idle}") Integer minIdle;  
    private @Value("${example.datasource.max-wait}") Integer maxWait;  
    private @Value("${example.datasource.initial-size}") Integer initialSize;  
    private @Value("${example.datasource.schema}") String defaultSchema;  

    @Bean  
    @Primary  
    public DataSource exampleDataSource() {  

     PoolProperties properties = new PoolProperties();  
     properties.setUrl(datasourceUrl);  
     properties.setUsername(username);  
     properties.setPassword(password);  
     properties.setDriverClassName(driverClassName);  
     properties.setInitialSize(initialSize);  
     properties.setMaxActive(maxActive);  
     properties.setMaxIdle(maxIdle);  
     properties.setMaxWait(maxWait);  
     properties.setMinIdle(minIdle);  

     return new DataSource(properties);  

    }  

    @Bean  
    @Primary  
    public LocalContainerEntityManagerFactoryBean exampleEntityManagerFactory() {  

     LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();  
     Properties properties = new Properties();  
     properties.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.SingletonEhCacheProvider");  
     properties.setProperty("hibernate.cache.use_second_level_cache", "true");  
     properties.setProperty("hibernate.cache.use_query_cache", "true");  
     properties.setProperty("hibernate.cache.use_structured_entries", "true");  
     properties.setProperty("hibernate.cache.region.factory_class",  
       "org.hibernate.cache.ehcache.EhCacheRegionFactory");  
     properties.setProperty("jadira.usertype.autoRegisterUserTypes", "true");  
     properties.setProperty("jadira.usertype.databaseZone", "jvm");  
     properties.setProperty("javax.persistence.sharedCache.mode", "ENABLE_SELECTIVE");  
     properties.setProperty("hibernate.generate_statistics", "false");  
     properties.setProperty("hibernate.hbm2ddl.auto", "create");  
     properties.setProperty("hibernate.default_schema", defaultSchema);  

     entityManager.setPackagesToScan("com.example.demo.model");  
     entityManager.setJpaVendorAdapter(new HibernateJpaVendorAdapter());  
     entityManager.setPersistenceUnitName(PERSITENCE_UNIT_NAME);  
     entityManager.setJpaProperties(properties);  
     entityManager.setDataSource(exampleDataSource());  

     return entityManager;  
    }  

    @Bean  
    @Primary  
    public PlatformTransactionManager defaultTransactionManager() {  

     JpaTransactionManager transactionManager = new JpaTransactionManager();  
     transactionManager.setEntityManagerFactory(exampleEntityManagerFactory().getObject());  
     return transactionManager;  
    }  

} 

我已經上傳的代碼重現錯誤我的GitHub:https://github.com/CarlosR-B/JoinedInheritanceError

編輯

我試圖找出是什麼導致測試框架和Spring Boot之間的不同行爲。我發現在Hibernate類MetamodelImpl上創建EntityPerister時發生錯誤。

,我能找到的唯一的事情是,建立EntityPersister時,測試框架是使用null accessStrategy和Spring引導使用NonstopAwareEntityRegionAccessStrategy

回答

0

如果你正在使用MySQL數據庫,你可能會面臨如下問題:https://hibernate.atlassian.net/browse/HHH-10490

更改以下行:

properties.setProperty("hibernate.default_schema", defaultSchema); 

到:

properties.setProperty("hibernate.default_catalog", defaultSchema); 

請注意,您可能希望將屬性名稱從「defaultSchema」更改爲「defaultCatalog」。

編輯:關於數據庫的注意事項。

相關問題