2014-07-07 18 views
22

Tôi đang cố gắng thiết lập cơ sở dữ liệu H2 khi khởi động ứng dụng khởi động mùa xuân. Tôi đã cấu hình cơ sở dữ liệu trong application.properties:Ứng dụng khởi động mùa xuân với cơ sở dữ liệu tệp H2

spring.datasource.url = jdbc:h2:file:~/testdb 
spring.datasource.username = sa 
spring.datasource.password = sa 
spring.datasource.driverClassName = org.h2.Driver 

File Application.java:

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 

     CreateH2Database createH2Database = new CreateH2Database(); 
     createH2Database.create(); 
    } 
} 

CreateH2Database.java:

public class CreateH2Database { 

    private Logger log = Logger.getLogger(CreateH2Database.class); 

    @Autowired 
    protected JdbcTemplate jdbcTemplate; 

    public void create() { 
     log.info("Creating H2 Database"); 
     createUsers(); 
    } 

    private void createUsers() { 
     log.info("Creating users table"); 
     jdbcTemplate.execute("create table if not exists users (id serial, first_name varchar(255), last_name varchar(255))"); 
     String[] names = "John Woo;Jeff Dean;Josh Bloch;Josh Long".split(";"); 
     for (String fullname : names) { 
      String[] name = fullname.split(" "); 
      log.info("Inserting user record for " + name[0] + " " + name[1] + "\n"); 
      jdbcTemplate.update(
       "INSERT INTO users(first_name,last_name) values(?,?)", 
       name[0], name[1]); 
      } 
     } 
    } 

Một khi ứng dụng được khởi động nó sẽ tạo ra Bảng người dùng nếu nó chưa tồn tại và chèn người dùng vào bảng. Nếu bảng đã tồn tại, tôi không muốn nó được sửa đổi.

  1. Tôi nhận được NullPointerException trên jdbcTemplate.execute. Làm cách nào để có được tiêm jdbcTemplate? Tất cả các ví dụ tôi đã thấy yêu cầu nguồn dữ liệu được tạo bằng tay, và sau đó JdbcTemplate được tạo ra. Tuy nhiên, nguồn dữ liệu trong ví dụ này dường như được tạo dựa trên các giá trị application.properties.
  2. Đây có phải là phương pháp đúng để thiết lập cơ sở dữ liệu (tức là gọi CreateH2Database sau khi bắt đầu SpringApplication) không? Cách tiếp cận này sẽ hoạt động nếu tôi muốn chạy ứng dụng như một WAR trên một máy chủ ứng dụng khác?

Trả lời

46

Vì bạn đang sử dụng Khởi động mùa xuân, bạn nên tận dụng các tính năng khởi tạo cơ sở dữ liệu của nó. Không cần phải triển khai thực hiện của riêng bạn.

Tất cả những gì bạn phải làm là có các tệp schema.sqldata.sql trên thư mục gốc của đường dẫn lớp (rất có thể là dưới /resources). Spring Boot sẽ tự động phát hiện chúng và chạy chương trình đầu tiên để tạo cơ sở dữ liệu và cơ sở dữ liệu thứ hai để điền nó.

Check-out this một phần của tài liệu xuân Boot

Nếu bạn cần phải thực hiện việc khởi tạo có điều kiện (có lẽ chỉ khi chạy thử nghiệm hội nhập), bạn có thể lợi dụng mùa xuân profiles. Bạn sẽ làm gì trong trường hợp đó là có nộp các thuộc tính cho cấu hình thử nghiệm chứa

spring.datasource.initialize=true

trong khi các thuộc tính tập tin cho các cấu hình khác sẽ chứa

spring.datasource.initialize=false

+0

Cảm ơn phản hồi của bạn. Tôi đã thử thêm các tệp 'schema.sql' và' data.sql'. Tuy nhiên, điều này sẽ tải dữ liệu từ 'data.sql' mỗi khi ứng dụng được khởi động. Tôi cần kích hoạt điều này nếu dữ liệu chưa được điền để thêm vào. Có cách nào để xác định các điều kiện như vậy khi khởi động không? – Jerry

+0

Nếu tôi có bài kiểm tra đơn vị và tích hợp và muốn chạy cả hai thì sao? Tại thời điểm này tôi có thể chạy một số bài kiểm tra tích hợp nhưng khi tôi thêm một bài kiểm tra đơn vị nó không thành công và cho tôi biết bảng đã tồn tại. – tObi

+0

@tobi Thật tuyệt vời khi thấy chính xác trường hợp của bạn trông như thế nào. Bạn có thể tạo một câu hỏi mới với tất cả các chi tiết có liên quan và đăng liên kết tại đây không? Cảm ơn – geoand

Các vấn đề liên quan