我有一个定义InheritanceType.JOINED
的类,其中有几个类继承自:{/ p>
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类EntityPerister
上创建MetamodelImpl
时会发生错误。
我唯一能找到的是,在构建EntityPersister时,测试框架正在使用null
accessStrategy,而Spring Boot正在使用NonstopAwareEntityRegionAccessStrategy
。
答案 0 :(得分:0)
如果您使用的是MySQL数据库,则可能会遇到以下问题:https://hibernate.atlassian.net/browse/HHH-10490
更改以下行:
properties.setProperty("hibernate.default_schema", defaultSchema);
为:
properties.setProperty("hibernate.default_catalog", defaultSchema);
请注意,您可能希望更改&#34; defaultSchema&#34;的属性名称。 to&#34; defaultCatalog&#34;同样。
编辑:关于数据库的注意事项。