gpt4 book ai didi

java - 为什么 Hibernate 模式验证无法验证模式

转载 作者:行者123 更新时间:2023-12-02 10:33:28 25 4
gpt4 key购买 nike

同样的问题已被问过多次,但没有一个能解决我的问题。

我创建了一个 hibernate + H2 + Sprinvg mvc 项目。我正在使用基于java的配置。我有以下与数据源、SessionFactory 和 TransactionManager 相关的 bean

@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
}

在 DataSource bean 中,我使用 addDefaultScripts() 并且有 2 个 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”属性。使用@Table(schema = "MYTESTDB", name = "TEST_TABLE")而不是@Table(name = "MYTESTDB.TEST_TABLE") 。但我必须在用户实体类中进行更多更改。而不是@GeneratedValue我添加的注释@GeneratedValue(strategy = GenerationType.IDENTITY) 。现在一切正常。

感谢@Slaw 和@Mykhailo 花费的宝贵时间。

关于java - 为什么 Hibernate 模式验证无法验证模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53472847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com