使用休眠连接构建独立的Spring Boot应用

时间:2018-10-11 19:03:42

标签: java spring

我正在尝试构建一个简单的应用程序,该应用程序与数据库连接并在其中保存一些数据,比如说每小时一次。我在baeldung等页面上找到了一些教程,但是它们的解决方案对我不起作用。

这是我的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">

<context:component-scan base-package="io.github.steve"/>

        <!-- Step 4: Add support for conversion, formatting and validation support -->
<mvc:annotation-driven/>

        <!-- Step 5: Define Spring MVC view resolver -->

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames" value="messages"/>
</bean>

<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/articles?useSSL=false"/>
<property name="user" value="root"/>
<property name="password" value=""/>
<property name="minPoolSize" value="5"/>
<property name="maxPoolSize" value="20"/>
<property name="maxIdleTime" value="30000"/>
</bean>

<bean id="sessionFactoryXXX" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="packagesToScan" value="io.github.steve.webscraping.domain"/>
<property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.show_sql">true</prop>
    </props>
</property>
</bean>

<bean id="myTransactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactoryXXX"/>
</bean>

<tx:annotation-driven transaction-manager="myTransactionManager"/>

        </beans>

ArticlesDaoImpl:

@Repository
public class ArticlesDaoImpl implements ArticlesDao {
    @Autowired
    SessionFactory sessionFactory;

    @Override
    public List<Article> getAllArticles() {
        Session session = sessionFactory.getCurrentSession();
        Query<Article> query = session.createQuery("from Article order by uploadDate", Article.class);
        return query.getResultList();
    }

    @Override
    public void addArticle(Article article) {
        Session session = sessionFactory.getCurrentSession();
        session.persist(article);
    }



}

ArticlesServiceImpl:

@Service
public class ArticlesServiceImpl implements ArticlesService {
    @Autowired
    private ArticlesDao articlesDao;

    @Override
    @Transactional
    public List<Article> getAllArticles() {
        return articlesDao.getAllArticles();
    }

    @Override
    @Transactional
    public void addArticle(Article article) {
        articlesDao.addArticle(article);
    }

    @Override
    @Transactional
    public void addArticles(List<Article> articles) {
        articles.stream().forEach(articlesDao::addArticle);
    }
}

现在: 首先,我不知道将xml配置文件放在哪里。 我不知道如何建立我的Main.class。我想将ArticlesService自动连线到Main类并从中运行一个方法。当我只使用SpringApplication.run(Main.class,args)时,它会加载并以退出代码1结尾。

主要应用:

@SpringBootApplication
@EnableScheduling
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

计划任务:

@Component
public class ScheduledTasks {
@Autowired
ArticlesService articlesService;

private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);


@Scheduled(cron = "* * * * *")
public void reportCurrentTime() {
    articlesService.addArticles(new MkyongWebScraper().getArticlesList());
}

}

我真的是Spring的新手,我知道这个问题涉及面很广,但是我找不到适合我任务的合适资料。我在做什么错了?

2 个答案:

答案 0 :(得分:0)

恐怕您正在编写的代码(尤其是XML配置)没有利用Spring Boot和Spring Boot 2提供的更容易,更方便的优势。

要生成项目的框架,请转到Spring Boot Initializer。您可以选择所需的依赖项(在您的情况下,应为“ JPA”,它基于Spring Data JPA),然后您可以在项目中下载一个zip。

您可能想看看Spring Boot documentation。 youtube上还有一些非常有趣的视频“ Spring Boot入门”。

一旦有了项目,就可以添加Spring Data JPA代码... Spring Boot文档中有关于Spring Data JPA的部分,但您也可以在documentation of Spring Data JPA project中找到更多信息。

好运

答案 1 :(得分:0)

我已经解决了我的问题。我只是对Spring不够了解。对于像我这样的人,我推荐Craig Walls的《春季行动》。