Почему проверка схемы Hibernate не может проверить схему - PullRequest
0 голосов
/ 26 ноября 2018

Один и тот же вопрос задавался несколько раз, но ни у одного из них нет решения моей проблемы.

Я создал проект hibernate + H2 + Sprinvg mvc.Я использую конфигурацию на основе Java.У меня есть следующие bean-компоненты, связанные с Datasource, SessionFactory и TransactionManager

@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

@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. Я использую 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]

Может кто-нибудь помочь мне выяснить проблему?

1 Ответ

0 голосов
/ 26 ноября 2018

Работает сейчас.С помощью @Slaw я могу использовать свойство "Validate" .Используйте @Table(schema = "MYTESTDB", name = "TEST_TABLE") вместо @Table(name = "MYTESTDB.TEST_TABLE").Но мне пришлось немного изменить класс пользовательских сущностей.Вместо @GeneratedValue аннотации я добавил @GeneratedValue(strategy = GenerationType.IDENTITY).Сейчас все работает нормально.

Спасибо @Slaw и @Mykhailo за ваше драгоценное время.

...