Hibernate Books

All times are UTC - 5 hours [ DST ]



Post new topic Reply to topic  [ 3 posts ] 
Author Message
 Post subject: Unable to build Hibernate SessionFactory when using Joined i
PostPosted: Mon May 22, 2017 4:14 am 
Newbie

Joined: Mon May 22, 2017 4:07 am
Posts: 2
I have a class that defines an InheritanceType.JOINED from which a couple more classes inherit from:

BaseClass


Code:
    @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 */



This class alone causes no problems when trying to run the app with Spring Boot. But if I add the other two classes:

SubClass1

Code:
    @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;


and

SubClass2

Code:
    @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;


I get the following error:
Code:
org.hibernate.AssertionFailure: Table example.BASE_CLASSES not found
.

The weird thing is (in the real life project I am working on) I can run my test suite (using a custom library based on Unitils) just fine but the app just won't start, with the same kind of error. Because of this I think that the error might be with the way I'm configuring the entity manager factory. I include the full stack trace and the configuration class below.

The full stack trace is:

Code:
    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   


My Configuration class is:

Quote:
@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;
}

}


I have uploaded the code to reproduce the error to my GitHub: https://github.com/CarlosR-B/JoinedInheritanceError

I originally posted this question to StackOverflow but no answers as of yet, so I figured I'd ask here: http://stackoverflow.com/questions/4408 ... nheritance


Top
 Profile  
 
 Post subject: Re: Unable to build Hibernate SessionFactory when using Joined i
PostPosted: Mon May 22, 2017 8:16 am 
Hibernate Team
Hibernate Team

Joined: Thu Sep 11, 2014 2:50 am
Posts: 1229
Although you should never use hibernate.hbm2ddl.auto in production since Flyway is a much better fit, try to change the property value to update:

Code:
properties.setProperty("hibernate.hbm2ddl.auto", "update");

_________________
If you liked my answer, you are going to love my High-Performance Java Persistence book and my blog as well.


Top
 Profile  
 
 Post subject: Re: Unable to build Hibernate SessionFactory when using Joined i
PostPosted: Tue May 23, 2017 3:56 am 
Newbie

Joined: Mon May 22, 2017 4:07 am
Posts: 2
Ended up changing the model a little bit and, after cleaning the workspace a couple, spring boot finally managed to start. I guess I'll fold this one under "MYSTERIES".

Thank you for your time.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.