Java 为什么Hibernate架构验证无法验证架构
同一个问题被问了很多次,但没有一个能解决我的问题 我已经创建了一个hibernate+H2+Sprinvg mvc项目。我正在使用基于java的配置。我有以下与Datasource、SessionFactory和TransactionManager相关的beanJava 为什么Hibernate架构验证无法验证架构,java,spring,hibernate,jdbc,h2,Java,Spring,Hibernate,Jdbc,H2,同一个问题被问了很多次,但没有一个能解决我的问题 我已经创建了一个hibernate+H2+Sprinvg mvc项目。我正在使用基于java的配置。我有以下与Datasource、SessionFactory和TransactionManager相关的bean @Configuration @ComponentScan(basePackages="org.testpackage") @EnableWebMvc @EnableTransactionManagement public class
@Configuration
@ComponentScan(basePackages="org.testpackage")
@EnableWebMvc
@EnableTransactionManagement
public class MyConfiguration extends WebMvcConfigurationSupport {
@Bean(initMethod="start",destroyMethod="stop")
public org.h2.tools.Server h2WebConsonleServer () throws SQLException {
return org.h2.tools.Server.createWebServer("-web","-webAllowOthers","-
webDaemon","-webPort", "8082");
}
@Bean
public DataSource getDataSource() {
return new EmbeddedDatabaseBuilder()
.generateUniqueName(false)
.setName("mytestdb")
.setType(EmbeddedDatabaseType.H2)
.addDefaultScripts()
.setScriptEncoding("UTF-8")
.ignoreFailedDrops(true)
.build();
}
@Bean
public LocalSessionFactoryBean sessionFactory() {
final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(getDataSource());
sessionFactory.setHibernateProperties(hibernateProperties());
sessionFactory.setPackagesToScan(new String[] {"org.testpackage.model"});
return sessionFactory;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(final SessionFactory sessionFactory) {
final HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}
final Properties hibernateProperties() {
final Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "validate");
hibernateProperties.setProperty("hibernate.show_sql", "true");
return hibernateProperties;
}
//Some more beans
}
我有以下实体类
@Entity
@Table(name = "MYTESTDB.TEST_TABLE")
public class User{
@Id
@GeneratedValue
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "email", unique = true)
private String email;
public User(int id, String name, String email) {
super();
this.id = id;
this.name = name;
this.email = email;
}
public User() {
}
//Getters and Setters
}
在DataSourceBean中,我使用addDefaultScripts,我有两个sql脚本,它们在H2中创建模式并插入一些预定义值。具体内容如下
//schema.sql Script
CREATE SCHEMA `MYTESTDB` ;
Drop TABLE IF EXISTS MYTESTDBDB.TEST_TABLE;
CREATE TABLE MYTESTDB.TEST_TABLE (
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
EMAIL VARCHAR(20) NOT NULL,
);
CREATE UNIQUE INDEX ON MYTESTDB.TEST_TABLE (EMAIL)
//data.sql Script
INSERT INTO MYTESTDB.TEST_TABLE(id, name, email)
VALUES ('1', 'Tom', 'tom12@hotmail.com');
如果我使用hibernate hbm2ddl.auto属性值create,则一切正常,hibernate会删除表并重新创建它。我已经通过网络浏览器验证过了。但是如果我使用validate属性,我会得到以下错误异常
Error creating bean with name 'sessionFactory' defined in org.testPackage.configuration.MYConfiguration: Invocation of init method failed; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [MYTESTDB.TEST_TABLE]
谁能帮我找出这个问题吗 现在开始工作了。在@Slaw的帮助下,我能够使用Validate属性。 使用@Tableschema=MYTESTDB,name=TEST\u TABLE代替@Tablename=MYTESTDB.TEST\u TABLE。但我必须在用户实体类中做更多的更改。我添加了@GeneratedValuestrategy=GenerationType.IDENTITY,而不是@GeneratedValueAnnotation。现在一切正常
感谢@Slaw和@Mykhailo为您提供的宝贵时间 如果您使用@Tableschema=MYTESTDB,name=TEST\u TABLE怎么办?@slaw我会测试它并返回给您。