2016-06-28 1 views
1

Ich möchte einige Daten in db beim Start der Spring-Boot-Anwendung hinzufügen. Ich verwende Spring-Daten-Jpa-Repositories, um Daten in der Datenbank zu speichern. Ich habe versucht, @PostConstruct Annotation zu einer Methode und ApplicationListener Schnittstelle, etc., aber keinen Erfolg überhaupt. Code wird in beiden Fällen ausgeführt, schreibt aber keine Daten in db. Wie kann ich es erreichen?Speichern von Daten in db beim Start mit Spring-Daten jpa

Code:

@Component 
public class DatabaseFillerOnStartup implements ApplicationListener { 

    @Autowired 
    private UserRepository userRepository; 

    private static Logger logger = LoggerFactory.getLogger(DatabaseFillerOnStartup.class); 

    @Override 
    public void onApplicationEvent(ApplicationEvent event) { 
     logger.info("===================================" +event.toString()); 
     User user = new User("test"); 
     user.setFirstName("test"); 
     user.setLastName("test"); 
     user.setEmail("[email protected]"); 
     user.setContactNumber("1234567890"); 
     userRepository.save(user); 
    } 

} 

Konfiguration:

@Configuration 
@EnableTransactionManagement 
@ComponentScan("com.furniturepool.bll.config") 
@PropertySource(value = "classpath:application.properties") 
public class HibernateConfiguration { 

    @Autowired 
    private Environment environment; 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     sessionFactory.setPackagesToScan("domain.package"); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty("spring.datasource.driver-class-name")); 
     dataSource.setUrl(environment.getRequiredProperty("spring.datasource.url")); 
     dataSource.setUsername(environment.getRequiredProperty("spring.datasource.username")); 
     dataSource.setPassword(environment.getRequiredProperty("spring.datasource.password")); 
     return dataSource; 
    } 

    private Properties hibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
     return properties; 
    } 

    @Bean 
    @Autowired 
    public HibernateTransactionManager transactionManager(SessionFactory s) { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(s); 
     return txManager; 
    } 
} 

Repository:

interface UserRepository extends CrudRepository<User, Long> { 
} 
+0

Ich habe mit Hibernate festgestellt, dass das Beste, was zu tun ist, die Protokollebene so hoch wie möglich einzustellen (obwohl DEBUG wird höchstwahrscheinlich es tut) und die Ausgabe gründlich zu studieren. Es gibt ziemlich oft und Fehler in den Protokollen oder zumindest einen Hinweis darauf, was als nächstes zu versuchen ist. – JLove

+0

@JLove: Lassen Sie mich mit Debug-Modus überprüfen –

+0

@JLove: Ich kann Daten aus db lesen ... aber Speichern funktioniert nicht .... es ist nur das Zurückgeben des Objekts selbst, ohne irgendeine Art von Fehler zu werfen –

Antwort

2

Ohne den Rest Ihrer Konfiguration habe ich eine Beispielanwendung zusammengestellt, die eine H2-Datenbank als Speicher und ein JpaRepository zum Speichern und Abrufen eines Benutzers verwendet.

spring-data-jpa-repository-example

gerade den Test ausführen ich hinzugefügt haben.

Beispiel Config für Mysql DB:

spring: 
    jpa: 
    show-sql: true 
    hibernate: 
     naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy 
     dialect: org.hibernate.dialect.MySQL5Dialect 
     ddl-auto: create-drop 
    datasource: 
    driver-class-name: com.mysql.jdbc.Driver 
    url: jdbc:mysql://localhost:3306/testdb?createDatabaseIfNotExist=true 
    test-on-borrow: true 
    validation-query: SELECT 1 
    username: xxx 
    password: xxx 

Denken Sie daran, MySQL zu Ihrem Classpath hinzuzufügen.

Hoffe, das hilft.

Justin

+0

Vielen Dank für Ihre Hilfe :), aber kann ich die Daten zur Produktionsmaschine mit Testcode erstellen? –

+0

@PranavCBalan Dies ist produktionsfertiger Code, ich habe ihn gerade als einen Junit-Test erstellt, so dass ich den Rest der Anwendung nicht einrichten muss. Bitte beachten Sie, dass mein Kommentar zu Datenquellen auch als Antwort gilt, wenn er Ihr Problem löst. – JLove

+0

Ich muss diese Daten auf den Produktionsserver schreiben –

0

stellen Sie sicher, commi haben t die Transaktion noch? oder setzen Sie hier Ihren 'userrepository' Code und die jda-xml-Konfiguration von spring-data-jpa.

+0

hinzugefügte Codes ...... –

+0

Der Lebenszyklus der Entitäten wird vom Repository verarbeitet, ohne dass explizit eine Transaktion definiert wird. Die Grenze für die Transaktion wird jeder Methodenaufruf im Repository sein. Du solltest dich nicht verpflichten. – JLove

Verwandte Themen