本文将分享在使用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进行单元测试的最佳方法是什么?
- hibernate4 在 maven 环境下使用 hsqldb
- java – 使用Spring Data和Hibernate时如何正确执行后台线程?
- java – 使用Spring和Maven时,将代码部署到服务器的最佳方法是什么?
- java – 在Hsqldb / H2中进行单元测试的SequenceGenerator问题
在使用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
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时如何正确执行后台线程?
@Service public class BackgroundJobService { @Autowired private ThreadPoolTaskExecutor threadPoolTaskExecutor; public void startJob(Runnable runnable) { threadPoolTaskExecutor.execute(runnable); } }
然后在Spring中配置ThreadPoolTaskExecutor:
<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请求的方法.
谢谢.
解决方法
你的懒惰异常的问题出现在你没有会话的新线程中.为避免此问题,您的异步方法应该处理完整的工作.不要提供以前加载的实体作为参数.该服务可以使用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时,将代码部署到服务器的最佳方法是什么?
有时,当他们对数据库模式进行更改时,我必须手动运行sql迁移脚本.
我可以使用更好的工作流程吗?由于项目的war文件为60MB,我不得不等待10-12分钟才能将其上传到服务器.如果我意识到需要改变一件小事,我必须重新做整个过程.
这对我来说是双坏的,因为在DSL上,上传带宽会导致下载带宽消耗,因此互联网完全无法运行.即使在项目上运行并运行maven目标也很慢,因为他们一直使用互联网连接来查找依赖项.
有更好的工作方式吗?谢谢.
解决方法
您可以在此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问题
@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问题的相关知识,请在本站寻找。
本文标签: