GVKun编程网logo

在使用spring,maven和hibernate时,启动HSQLDB进行单元测试的最佳方法是什么?

14

本文将分享在使用spring,maven和hibernate时,启动HSQLDB进行单元测试的最佳方法是什么?的详细内容,此外,我们还将为大家带来关于hibernate4在maven环境下使用hsql

本文将分享在使用spring,maven和hibernate时,启动HSQLDB进行单元测试的最佳方法是什么?的详细内容,此外,我们还将为大家带来关于hibernate4 在 maven 环境下使用 hsqldb、java – 使用Spring Data和Hibernate时如何正确执行后台线程?、java – 使用Spring和Maven时,将代码部署到服务器的最佳方法是什么?、java – 在Hsqldb / H2中进行单元测试的SequenceGenerator问题的相关知识,希望对你有所帮助。

本文目录一览:

在使用spring,maven和hibernate时,启动HSQLDB进行单元测试的最佳方法是什么?

在使用spring,maven和hibernate时,启动HSQLDB进行单元测试的最佳方法是什么?

在我的项目中,我可以成功测试数据库代码。我正在使用Spring,Hibernate,HSQLDB,JUnit和Maven。

问题是,当前我必须在运行测试之前手动启动HSQLDB。使用所使用的技术自动启动HSQLDB的最佳方法是什么?

答案1

小编典典

我假设与hsql您一起指的是HSQLDB。

将JDBC驱动程序(用于hibernate等)的数据库URL配置为基于嵌入式内存的HSQLDB版本:

jdbc:hsqldb:mem:myunittests

然后,将自动启动一个进程内版本的HSQLDB,它将内容存储到内存中。无需启动任何外部服务器。

hibernate4 在 maven 环境下使用 hsqldb

hibernate4 在 maven 环境下使用 hsqldb

 

1      简介

Hsqldb 是一个开放源代码的 JAVA 数据库,其具有标准的 SQL 语法和 JAVA 接口,它可以自由使用和分发,非常简洁和快速的。

HSqlDB 非常适合在用于快速的测试和演示的 Java 程序中。

http://hsqldb.org/

2      配置 maven pom.xml 文件

                   <dependency>

                            <groupId>org.hibernate</groupId>

                            <artifactId>hibernate-search-orm</artifactId>

                            <version>4.4.2.Final</version>

                   </dependency>

                   <dependency>

                            <groupId>org.hsqldb</groupId>

                            <artifactId>hsqldb</artifactId>

                            <version>2.3.0</version>

                   </dependency>

 

3      启动数据库的 mvn 命令

Mvn exec:java  -Dexec.main-Dexec.args="-database.0  file:target/data/tutorial"

 

4      启动数据库管理控制台的 mvn 命令

Mvn exec:java  -Dexec.main

 

5      Hibernate 配置文件

<?xml version=''1.0''  encoding=''utf-8''?>

<!DOCTYPE hibernate-configuration  PUBLIC

         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

         <session-factory>

                   <!--  Database connection settings -->

                   <property  name="connection.driver_class">org.hsqldb.jdbcDriver</property>

                   <property  name="connection.url">jdbc:hsqldb:hsql://localhost</property>

                   <property  name="connection.username">sa</property>

                   <property  name="connection.password"></property>

 

                  <!-- JDBC connection pool (use the  built-in) -->

                   <property  name="connection.pool_size">1</property>

 

                   <!--  SQL dialect -->

                   <property  name="dialect">org.hibernate.dialect.HSQLDialect</property>

 

                   <!--  Enable Hibernate''s automatic session context management -->

                   <property  name="current_session_context_class">thread</property>

 

                   <!--  Disable the second-level cache -->

                   <property  name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

 

                   <!--  Echo all executed SQL to stdout -->

                   <property  name="show_sql">true</property>

 

                   <!--  Drop and re-create the database schema on startup -->

                   <property  name="hbm2ddl.auto">update</property>

 

                   <mapping  />

                   <mapping  />

         </session-factory>

</hibernate-configuration>

 

6      测试下是否可以使用

hibernate 工具类:

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

 

public class HibernateUtil {

 

     private static final SessionFactory sessionFactory =  buildSessionFactory();

 

     private static SessionFactory buildSessionFactory() {

         try {

            // Create the SessionFactory from  hibernate.cfg.xml

            return new  Configuration().configure().buildSessionFactory();

         }

         catch (Throwable ex) {

            // Make sure you log the  exception, as it might be swallowed

            System.err.println("Initial  SessionFactory creation failed." + ex);

            throw new  ExceptionInInitializerError(ex);

         }

     }

 

     public static SessionFactory getSessionFactory() {

         return sessionFactory;

     }

 

}

 

Hibernate 测试方法(java bean 自己创建吧):

public static void main(String[] args) {

 

        Session session =  HibernateUtil.getSessionFactory().getCurrentSession();

                  

                   session.beginTransaction();

//               SchemaExport  schemaExport = new SchemaExport(configuration);

//               schemaExport.create(true,  true);

//               Author  author = new Author();

//               author.setName(" 是的 ");

//               session.save(author);

                   Query  query =  session.createQuery("from  Author");

                   List<Author>  list = query.list();

                   System.out.println(list.size());

                  

                   session.getTransaction().commit();

                  

         }

 

 

java – 使用Spring Data和Hibernate时如何正确执行后台线程?

java – 使用Spring Data和Hibernate时如何正确执行后台线程?

我正在构建一个使用 Spring Data和Hibernate的简单Tomcat webapp.有一个终点可以完成很多工作,因此我想将工作卸载到后台线程,以便在完成工作时Web请求不会挂起10分钟.所以我在一个组件扫描包中写了一个新服务:

@Service
public class BackgroundJobService {
    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;

    public void startJob(Runnable runnable) {
         threadPoolTaskExecutor.execute(runnable);
    }
}

然后在Spring中配置ThreadPoolTask​​Executor:

<bean id="threadPoolTaskExecutor">
    <property name="corePoolSize" value="5" />
    <property name="maxPoolSize" value="10" />
    <property name="queueCapacity" value="25" />
</bean>

这一切都很有效.但问题来自Hibernate.在我的runnable中,查询只有一半工作.我可以:

MyObject myObject = myObjectRepository.findOne()
myObject.setSomething("something");
myObjectRepository.save(myObject);

但是如果我有延迟加载的字段,它会失败:

MyObject myObject = myObjectRepository.findOne()
List<Lazy> lazies = myObject.getLazies();
for(Lazy lazy : lazies) { // Exception
    ...
}

我收到以下错误:

org.hibernate.LazyInitializationException: Failed to lazily initialize a collection of role: com.stackoverflow.MyObject.lazies,Could not initialize proxy - no Session

所以我觉得(Hibernate新手)新线程在这些自制线程上没有会话,但Spring Data会自动为HTTP Request线程创建新会话.

>有没有办法从会话中手动启动新会话?
>或者告诉线程池为我做这件事的方法?
>做这种工作的标准做法是什么?

我已经能够通过在@Transactional方法中做一些事情来解决它,但我很快就知道这不是一个非常好的解决方案,因为这不会让我使用适用于Web请求的方法.

谢谢.

解决方法

使用Spring,您不需要自己的执行程序.一个简单的注释@Async将为您完成工作.只需使用它在您的服务中注释您的heavyMethod并返回void或Future对象,您将获得一个后台线程.我会避免在控制器级别使用异步注释,因为这将在请求池执行程序中创建一个异步线程,并且您可能会用完“请求接受器”.

你的懒惰异常的问题出现在你没有会话的新线程中.为避免此问题,您的异步方法应该处理完整的工作.不要提供以前加载的实体作为参数.该服务可以使用EntityManager,也可以是事务性的.

我自己不合并@Async和@Transactional所以我可以以任何一种方式运行服务.我只是在服务周围创建异步包装器,如果需要,可以使用它. (这简化了测试)

@Service
public class AsyncService {

    @Autowired
    private Service service;

    @Async
    public void doAsync(int entityId) {
        service.doHeavy(entityId);
    }
}

@Service
public class Service {

    @PersistenceContext
    private EntityManager em;

    @Transactional
    public void doHeavy(int entityId) {
        // some long running work
    }
}

java – 使用Spring和Maven时,将代码部署到服务器的最佳方法是什么?

java – 使用Spring和Maven时,将代码部署到服务器的最佳方法是什么?

我有一个使用 Spring的项目.每次部署时,我都会运行maven目标“package”,它运行所有测试并创建war文件.然后我手动使用ftp程序将war文件复制到服务器.然后我运行一个bash脚本来关闭服务器,替换战争并再次启动服务器.

有时,当他们对数据库模式进行更改时,我必须手动运行sql迁移脚本.

我可以使用更好的工作流程吗?由于项目的war文件为60MB,我不得不等待10-12分钟才能将其上传到服务器.如果我意识到需要改变一件小事,我必须重新做整个过程.

这对我来说是双坏的,因为在DSL上,上传带宽会导致下载带宽消耗,因此互联网完全无法运行.即使在项目上运行并运行maven目标也很慢,因为他们一直使用互联网连接来查找依赖项.

有更好的工作方式吗?谢谢.

解决方法

首先,您可以使用Maven Deploy插件来避免手动ftp副本.
您可以在此URL上找到通过ftp部署项目的方法:

http://maven.apache.org/plugins/maven-deploy-plugin/examples/deploy-ftp.html

第二点是关于你的项目的问题:你的WAR大小是否正常?
我听说过嵌入多余jar的配置,以避免在构建最终jar时meta-inf / spring.handlers覆盖的问题.如果您遇到这种情况,您可能也会对此感兴趣:

http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html

java – 在Hsqldb / H2中进行单元测试的SequenceGenerator问题

java – 在Hsqldb / H2中进行单元测试的SequenceGenerator问题

我已经尝试使用Hsqldb和H2进行单元测试,但面临序列生成器的问题.字段声明如下所示.

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="keyword_seq")
@SequenceGenerator(name="keyword_seq",sequenceName="KEYWORD_ID_SEQ",allocationSize=1)
@Column(name="IM_KEYWORD_ID")
private Long keywordId;

当我尝试使用以下配置在Hsqldb中测试此表中的简单插入时,它会给出错误

<prop key="hibernate.connection.driver_class">org.hsqldb.jdbc.JDBCDriver</prop>
<prop key="hibernate.connection.url">jdbc:hsqldb:mem:testdb;sql.Syntax_ora=true</prop>

错误:

Caused by: java.sql.sqlSyntaxErrorException: user lacks privilege or object not found: KEYWORD_ID_SEQ.NEXTVAL
        at org.hsqldb.jdbc.Util.sqlException(UnkNown Source)
        at org.hsqldb.jdbc.Util.sqlException(UnkNown Source)

使用H2:

<prop key="hibernate.connection.driver_class">org.h2.Driver</prop>
<prop key="hibernate.connection.url">jdbc:h2:~/test</prop>

错误是:

Hibernate: select KEYWORD_ID_SEQ.nextval from dual
3085 [main] WARN org.hibernate.util.JDBCExceptionReporter  - sql Error: 42001,sqlState: 42001
3088 [main] ERROR org.hibernate.util.JDBCExceptionReporter  - Syntax error in sql statement "SELECT KEYWORD_ID_SEQ.NEXTVAL FROM[*] DUAL "; expected "identifier"; sql statement:

任何想法,如何解决这个问题?

解决方法

我认为方言设置错误.你能检查你的休眠配置吗?

关于在使用spring,maven和hibernate时,启动HSQLDB进行单元测试的最佳方法是什么?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于hibernate4 在 maven 环境下使用 hsqldb、java – 使用Spring Data和Hibernate时如何正确执行后台线程?、java – 使用Spring和Maven时,将代码部署到服务器的最佳方法是什么?、java – 在Hsqldb / H2中进行单元测试的SequenceGenerator问题的相关知识,请在本站寻找。

本文标签: