2012-03-13 154 views
7

我想在啓動時從文本文件填充我的數據庫的某些表,我希望僅在啓動應用程序時調用初始化方法。Spring Web應用程序:在啓動時執行一些操作(初始化)

我使用Spring(+ MVC)和Hibernate與MySQL。

我該怎麼辦?

+0

[從數據庫上起動彈簧的web應用程序的初始化(的可能重複http://stackoverflow.com/questions/ 7082594/spring-web-application-initialization-from-database-on-startup) – 2012-03-13 08:16:36

+1

@Tomasz Nurkiewicz:is not a duplicate of http://stackoverflow.com/questions/7082594/spring-web-application-initialization-from -database-on-startup,因爲信息流是周圍的另一種方式,所以可以用其他方式來解決問題。 – Ralph 2012-03-13 08:46:13

+0

非常相似。礦是更通用一點。 – 2012-03-13 09:16:14

回答

5

地方使用postconstuct註解的bean裏面:

@PostConstruct 
public void init() { 
    //startup logic here 
} 

可能使(DESGIN)感覺使用一種配置,豆,但它可以是任何豆在所有。

+0

好的,所以正確的方法可以使「Initializator」單身人士和@PostConstruct的方法?謝謝! :) – 2012-03-13 08:19:27

+0

這對於啓動AsyncTasks不起作用。使用sinuhepop的建議如下 - http://stackoverflow.com/a/9680800/1019307 – HankCa 2015-01-08 03:26:04

7

Hibernate提供了一種方法來添加一些文件與SQL語句,將在啓動時執行。

參數是hibernate.hbm2ddl.import_files

@see Hibernate Reference: Chapter 3.4. Optional configuration properties

  • 表3.7。其他屬性
  • hibernate.hbm2ddl.import_files:

包含SQL DML SessionFactory的創建過程中執行 語句的可選文件的逗號分隔的名字。這對於測試或演示非常有用 :例如,通過添加INSERT語句,您可以在部署 時使用最少的一組數據填充數據庫。

文件順序很重要,一個給定文件的語句在 之前執行以下文件的語句。這些語句僅在 執行,如果架構被創建,即如果hibernate.hbm2ddl.auto設置爲 創建或創建。

例如/humans.sql,/dogs.sql

我喜歡一些提示,如果Hibernate是在「創造」模式下啓動,這可能只是工作。但我不確定。

+0

非常有用。這不是問題本身的答案,但是......這正是我需要的!謝謝!但是,我不能使import_files工作:(而不是它我在我的類路徑中放一個「import.sql」,它執行完美! – 2012-03-13 09:15:02

16

您可以創建一個應用程序偵聽器,它專門爲這些需求而設計。在這種情況下,每次上下文開始(或刷新)時都會執行。

@Component 
public class DatabaseFillerOnStartup implements ApplicationListener<ContextRefreshedEvent> { 
    @Override 
    public void onApplicationEvent(ContextRefreshedEvent event) { 
     ... 
    } 
} 
+0

有用,謝謝:) – 2012-03-13 09:13:18

+0

正是我想要做一個自我診斷。謝謝! – Marquee 2014-07-03 15:24:00

+0

這應該是答案... :) – 2015-03-23 03:40:15

0

兩個選項,

第一:讓Hibernate創建DDL每次服務是啓動(僅適用於本地或開發環境)

<bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
     p:showSql="false" 
     p:generateDdl="true"/> 

還是在春天創建一個與INIT-豆懶惰的假,並在那裏添加創建數據庫的邏輯,如果你沒有它或注入你的腳本,或做任何你想要的。

<bean id="bootstrapStartup" class="com.tscompany.rest.bootstrap.BootstrapStartup" lazy-init="false" init-method="init"/> 
0

您可以創建在根上下文配置一些豆 - 像

<bean id="someBean" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="someProperty"> 
     ... description of the property 
    </property> 
    <property name="targetMethod" value="methodName" /> 
</bean> 

這樣 - 在應用程序啓動方法「方法名」將被調用。我們以這種方式實施了數據庫升級。

0

如果您在hibernate.hbm2ddl.auto屬性設置爲createcreate-drop然後做到這一點的最簡單的方法是通過設置hibernate.hbm2ddl.import_files財產與包含SQL語句到你的初始數據加載到數據庫架構SQL文件名,例如初始應用用戶。

以下是我在DatabaseConfig類中使用的示例方法。它設置hibernate.hbm2ddl.import_files屬性與SQL文件名import_initial_data.sql包含SQL Insert語句將我的初始數據加載到數據庫模式。

@Bean 
    public LocalSessionFactoryBean hibernate5SessionFactoryBean(){ 
     LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean(); 
     localSessionFactoryBean.setDataSource((DataSource) appContext.getBean("DataSource")); 
     localSessionFactoryBean.setAnnotatedClasses(AppUser.class); 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); 
     properties.put("hibernate.hbm2ddl.auto","create-drop"); 
     properties.put("hibernate.hbm2ddl.import_files", "import_initial_data.sql"); 
     properties.put("hibernate.show_sql","true"); 
     localSessionFactoryBean.setHibernateProperties(properties); 
     return localSessionFactoryBean; 
    } 

這是我在AppUser.javamodel

package com.beniregev.model; 

import lombok.AccessLevel; 
import lombok.AllArgsConstructor; 
import lombok.NoArgsConstructor; 
import javax.persistence.*; 

@Entity 
@NoArgsConstructor(access = AccessLevel.PUBLIC) 
@AllArgsConstructor(access = AccessLevel.PUBLIC) 
public class AppUser { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    @Column(nullable = false, unique = true) 
    private String userName; 
    @Column(nullable = false) 
    private String password; 

    public AppUser(String userName, String password) { 
     this.userName = userName; 
     this.password = password; 
    } 
} 

Maven的依賴於龍目島

<dependency> 
    <groupId>org.projectlombok</groupId> 
    <artifactId>lombok</artifactId> 
    <version>1.16.6</version> 
    <scope>provided</scope> 
</dependency> 

import_initial_data.sql文件,我在resources目錄:

INSERT INTO appuser(username, password) VALUES ('jesus', 'christ'); 
INSERT INTO appuser(username, password) VALUES ('mary', 'virgin'); 
INSERT INTO appuser(username, password) VALUES ('josef', 'who?'); 
INSERT INTO appuser(username, password) VALUES ('jeremaia', 'profet'); 
COMMIT; 

而* SELECT * FROM APPUSER的結果; *:

Resultset of SELECT * FROM appuser;

相關問題