我想在启动时从文本文件填充我的数据库的某些表,我希望仅在启动应用程序时调用初始化方法。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