2012-03-13 152 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;

相关问题