我想在啓動時從文本文件填充我的數據庫的某些表,我希望僅在啓動應用程序時調用初始化方法。Spring Web應用程序:在啓動時執行一些操作(初始化)
我使用Spring(+ MVC)和Hibernate與MySQL。
我該怎麼辦?
我想在啓動時從文本文件填充我的數據庫的某些表,我希望僅在啓動應用程序時調用初始化方法。Spring Web應用程序:在啓動時執行一些操作(初始化)
我使用Spring(+ MVC)和Hibernate與MySQL。
我該怎麼辦?
地方使用postconstuct註解的bean裏面:
@PostConstruct
public void init() {
//startup logic here
}
可能使(DESGIN)感覺使用一種配置,豆,但它可以是任何豆在所有。
好的,所以正確的方法可以使「Initializator」單身人士和@PostConstruct的方法?謝謝! :) – 2012-03-13 08:19:27
這對於啓動AsyncTasks不起作用。使用sinuhepop的建議如下 - http://stackoverflow.com/a/9680800/1019307 – HankCa 2015-01-08 03:26:04
Hibernate提供了一種方法來添加一些文件與SQL語句,將在啓動時執行。
參數是hibernate.hbm2ddl.import_files
。
@see Hibernate Reference: Chapter 3.4. Optional configuration properties
包含SQL DML SessionFactory的創建過程中執行 語句的可選文件的逗號分隔的名字。這對於測試或演示非常有用 :例如,通過添加INSERT語句,您可以在部署 時使用最少的一組數據填充數據庫。
文件順序很重要,一個給定文件的語句在 之前執行以下文件的語句。這些語句僅在 執行,如果架構被創建,即如果hibernate.hbm2ddl.auto設置爲 創建或創建。
例如/humans.sql,/dogs.sql
我喜歡一些提示,如果Hibernate是在「創造」模式下啓動,這可能只是工作。但我不確定。
非常有用。這不是問題本身的答案,但是......這正是我需要的!謝謝!但是,我不能使import_files工作:(而不是它我在我的類路徑中放一個「import.sql」,它執行完美! – 2012-03-13 09:15:02
您可以創建一個應用程序偵聽器,它專門爲這些需求而設計。在這種情況下,每次上下文開始(或刷新)時都會執行。
@Component
public class DatabaseFillerOnStartup implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
...
}
}
有用,謝謝:) – 2012-03-13 09:13:18
正是我想要做一個自我診斷。謝謝! – Marquee 2014-07-03 15:24:00
這應該是答案... :) – 2015-03-23 03:40:15
兩個選項,
第一:讓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"/>
您可以創建在根上下文配置一些豆 - 像
<bean id="someBean" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="someProperty">
... description of the property
</property>
<property name="targetMethod" value="methodName" />
</bean>
這樣 - 在應用程序啓動方法「方法名」將被調用。我們以這種方式實施了數據庫升級。
如果您在hibernate.hbm2ddl.auto
屬性設置爲create
或create-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.java
包model
:
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的結果; *:
[從數據庫上起動彈簧的web應用程序的初始化(的可能重複http://stackoverflow.com/questions/ 7082594/spring-web-application-initialization-from-database-on-startup) – 2012-03-13 08:16:36
@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
非常相似。礦是更通用一點。 – 2012-03-13 09:16:14