Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate.hbm2ddl.auto create中找不到表_Java_Spring_Hibernate_Spring Security_Spring Data - Fatal编程技术网

Java 在hibernate.hbm2ddl.auto create中找不到表

Java 在hibernate.hbm2ddl.auto create中找不到表,java,spring,hibernate,spring-security,spring-data,Java,Spring,Hibernate,Spring Security,Spring Data,我正在试验Spring MVC和Spring安全性,遇到了以下问题:我正在使用H2并将hibernate.hbm2ddl.auto设置为创建,但当我尝试添加用户记录时,我得到了org.H2.jdbc.JdbcSQLException:未找到表“user” 这是我的数据库配置: @Configuration @EnableJpaRepositories @EnableTransactionManagement public class DatabaseConfig { @Bean

我正在试验Spring MVC和Spring安全性,遇到了以下问题:我正在使用H2并将hibernate.hbm2ddl.auto设置为创建,但当我尝试添加用户记录时,我得到了
org.H2.jdbc.JdbcSQLException:未找到表“user”

这是我的数据库配置:

@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
public class DatabaseConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource datasource = new DriverManagerDataSource();
        datasource.setDriverClassName("org.h2.Driver");
        datasource.setUsername("sa");
        datasource.setPassword("");
        datasource.setUrl("jdbc:h2:mem:web");
        return datasource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
        LocalContainerEntityManagerFactoryBean factoryBean
                = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(dataSource());
        factoryBean.setPackagesToScan("mypackage.model");
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        factoryBean.setJpaVendorAdapter(vendorAdapter);
        factoryBean.setJpaProperties(this.additionalProperties());
        return factoryBean;
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

    private Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.format_sql", "false");
        properties.setProperty("hibernate.hbm2ddl.auto", "create");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        return properties;
    }

}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .antMatcher("/api/**")
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .httpBasic();
    }

}
这就是模型:

@Entity
public class User implements UserDetails {

    @Id
    private Long id;
    private String username;
    private String password;
    @ElementCollection
    private List<Role> authorities = new ArrayList<Role>();
    private Boolean accountNonExpired;
    private Boolean accountNonLocked;
    private Boolean credentialsNonExpired;
    private Boolean enabled;

    public User() {
        this.accountNonExpired = true;
        this.accountNonLocked = true;
        this.credentialsNonExpired = true;
        this.enabled = true;
    }

    // ...

}
这就是我为测试目的添加用户的方法:

@Autowired
private CustomUserDetailsService customUserDetailsService;

@RequestMapping("/init")
@ResponseBody
public String init() {

    User user = new User();
    user.setId(0L);
    user.setUsername("user");
    user.setPassword("password");
    customUserDetailsService.save(user);

    return "{name:'init'}";
}
显然,这些表是创建的:

Hibernate: drop table User if exists
Hibernate: drop table User_authorities if exists
Hibernate: create table User (id bigint not null, accountNonExpired boolean, accountNonLocked boolean, credentialsNonExpired boolean, enabled boolean, password varchar(255), username varchar(255), primary key (id))
Hibernate: create table User_authorities (User_id bigint not null, authorities binary(255))
Hibernate: alter table User_authorities add constraint FK_6yei1bmvdwkqgfn4hw53bvqus foreign key (User_id) references User
[2014-12-04 03:20:32,045] Artifact web:war exploded: Artifact is deployed successfully
但是调用
init()
方法时,我得到如下结果:

org.h2.jdbc.JdbcSQLException: Table "USER" not found; SQL statement:
select user0_.id as id1_0_0_, user0_.accountNonExpired as accountN2_0_0_, user0_.accountNonLocked as accountN3_0_0_, user0_.credentialsNonExpired as credenti4_0_0_, user0_.enabled as enabled5_0_0_, user0_.password as password6_0_0_, user0_.username as username7_0_0_ from User user0_ where user0_.id=? [42102-181]
    org.h2.message.DbException.getJdbcSQLException(DbException.java:345)

尝试将您的Url设置为

datasource.setUrl("jdbc:h2:mem:web;INIT=CREATE SCHEMA IF NOT EXISTS<yourschema>");
datasource.setUrl(“jdbc:h2:mem:web;INIT=createschema,如果不存在”);

有关更多信息,请参阅。

这没有立即起作用,但我尚未研究文档。现在我已经切换到HSQL,但当我再次研究H2时,我会发回帖子。