2014-12-04 65 views
2

我正在尝试使用Spring MVC和Spring Security,并遇到以下问题:我使用H2并设置了hibernate.hbm2ddl.auto来创建,但是当我尝试添加用户记录我得到org.h2.jdbc.JdbcSQLException: Table "USER" not found表未找到hibernate.hbm2ddl.auto创建

这是我的数据库配置:

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

} 

这是模型:

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

    // ... 

} 

这是安全配置:

@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(); 
    } 

} 

这是我尝试添加用于测试目的的用户:

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

回答

0

试试你的URL设置最多。

datasource.setUrl("jdbc:h2:mem:web;INIT=CREATE SCHEMA IF NOT EXISTS<yourschema>"); 

有关更多信息,请参阅http://www.h2database.com/html/features.html

+0

这没有马上帮助,但我还没有研究过文档。现在我已经切换到HSQL,但是当我再次查看H2时,我会回复。 – user3170702 2014-12-09 14:21:11