原文: https://howtodoinjava.com/hibernate/hibernate-4-using-in-memory-database-with-hibernate/

在我们工作的组织中,朋友经常不允许甚至访问必要的开发人员工具,例如本地数据库安装。 这也可能是由于相当正当的原因(有时似乎只是荒谬的)。 在此 Hiberate 内存数据库教程中,我提供了一个无需安装任何数据库即可测试您的 Hiberate 代码的示例。

这可以帮助您编写应用的单元测试用例,因为某些架构师将数据库访问视为依赖。

1. 内存数据库实现

1.1 Maven 依赖

  1. <dependency>
  2. <groupId>hsqldb</groupId>
  3. <artifactId>hsqldb</artifactId>
  4. <version>1.8.0.10</version>
  5. </dependency>

1.2 获取数据库连接

对于此示例,我使用 HSQLDB 数据库通过我们的 Hiberate 代码创建和访问内存数据库。 如果您使用简单的简单 JDBC,则可以直接使用下面的语句访问内存数据库。

  1. Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:howtodoinjava", "sa", "");

这里要注意的主要事情是“mem:howtodoinjava”。 这里mem表示使用内存数据库,而不是任何物理数据库。

1.3 需要默认的用户名和密码

请注意,尽管您将必须提供默认的用户名“sa”和一个空白密码才能连接到数据库,否则将出现以下异常。

  1. Caused by: java.sql.SQLException: Access is denied
  2. at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
  3. at org.hsqldb.jdbc.jdbcConnection.<init>(Unknown Source)
  4. at org.hsqldb.jdbcDriver.getConnection(Unknown Source)
  5. at org.hsqldb.jdbcDriver.connect(Unknown Source)
  6. at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:55)
  7. ... 15 more

2. Hibernate 内存数据库示例

现在,在下面的源代码文件中查找使用 hibernate 进行内存数据库访问的示例。

2.1 hibernate.cfg.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <property name="hibernate.archive.autodetection">class,hbm</property>
  8. <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
  9. <property name="hibernate.show_sql">true</property>
  10. <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
  11. <property name="hibernate.connection.username">sa</property>
  12. <property name="hibernate.connection.password"></property>
  13. <property name="hibernate.connection.url">jdbc:hsqldb:mem:howtodoinjava</property>
  14. <property name="hibernate.hbm2ddl.auto">create</property>
  15. <mapping class="com.howtodoinjava.demo.entity.EmployeeEntity"></mapping>
  16. </session-factory>
  17. </hibernate-configuration>

2.2. HibernateUtil.java

  1. package com.howtodoinjava.demo.util;
  2. import org.hibernate.SessionFactory;
  3. import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
  4. import org.hibernate.cfg.Configuration;
  5. import org.hibernate.service.ServiceRegistry;
  6. public class HibernateUtil
  7. {
  8. private static SessionFactory sessionFactory = buildSessionFactory();
  9. private static SessionFactory buildSessionFactory()
  10. {
  11. try
  12. {
  13. if (sessionFactory == null)
  14. {
  15. Configuration configuration = new Configuration().configure(HibernateUtil.class.getResource("/hibernate.cfg.xml"));
  16. StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();
  17. serviceRegistryBuilder.applySettings(configuration.getProperties());
  18. ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();
  19. sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  20. }
  21. return sessionFactory;
  22. } catch (Throwable ex)
  23. {
  24. System.err.println("Initial SessionFactory creation failed." + ex);
  25. throw new ExceptionInInitializerError(ex);
  26. }
  27. }
  28. public static SessionFactory getSessionFactory()
  29. {
  30. return sessionFactory;
  31. }
  32. public static void shutdown()
  33. {
  34. getSessionFactory().close();
  35. }
  36. }

2.3. EmployeeEntity.java

  1. package com.howtodoinjava.demo.entity;
  2. import java.io.Serializable;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.Id;
  6. import javax.persistence.Table;
  7. import javax.persistence.UniqueConstraint;
  8. @Entity
  9. @org.hibernate.annotations.Entity(dynamicUpdate = true)
  10. @Table(name = "Employee", uniqueConstraints = {@UniqueConstraint(columnNames = "ID"), @UniqueConstraint(columnNames = "EMAIL")})
  11. public class EmployeeEntity implements Serializable
  12. {
  13. private static final long serialVersionUID = -1798070786993154676L;
  14. @Id
  15. @Column(name = "ID", unique = true, nullable = false)
  16. private Integer employeeId;
  17. @Column(name = "EMAIL", unique = true, nullable = false, length = 100)
  18. private String email;
  19. @Column(name = "FIRST_NAME", unique = false, nullable = false, length = 100)
  20. private String firstName;
  21. @Column(name = "LAST_NAME", unique = false, nullable = false, length = 100)
  22. private String lastName;
  23. public Integer getEmployeeId()
  24. {
  25. return employeeId;
  26. }
  27. public void setEmployeeId(Integer employeeId)
  28. {
  29. this.employeeId = employeeId;
  30. }
  31. public String getEmail()
  32. {
  33. return email;
  34. }
  35. public void setEmail(String email)
  36. {
  37. this.email = email;
  38. }
  39. public String getFirstName()
  40. {
  41. return firstName;
  42. }
  43. public void setFirstName(String firstName)
  44. {
  45. this.firstName = firstName;
  46. }
  47. public String getLastName()
  48. {
  49. return lastName;
  50. }
  51. public void setLastName(String lastName)
  52. {
  53. this.lastName = lastName;
  54. }
  55. }

现在测试上面的代码。

2.4. TestHibernate.java

  1. package com.howtodoinjava.test;
  2. import org.hibernate.Session;
  3. import com.howtodoinjava.demo.entity.EmployeeEntity;
  4. import com.howtodoinjava.demo.util.HibernateUtil;
  5. public class TestHibernate
  6. {
  7. public static void main(String[] args)
  8. {
  9. Session session = HibernateUtil.getSessionFactory().openSession();
  10. session.beginTransaction();
  11. // Add new Employee object
  12. EmployeeEntity emp = new EmployeeEntity();
  13. emp.setEmployeeId(1);
  14. emp.setEmail("demo-user@mail.com");
  15. emp.setFirstName("demo");
  16. emp.setLastName("user");
  17. session.save(emp);
  18. session.getTransaction().commit();
  19. HibernateUtil.shutdown();
  20. }
  21. }
  22. Output:
  23. Hibernate: drop table Employee if exists
  24. Hibernate: create table Employee (ID integer not null, EMAIL varchar(100) not null, FIRST_NAME varchar(100) not null, LAST_NAME varchar(100) not null, primary key (ID))
  25. Hibernate: alter table Employee add constraint UK_ardf0f11mfa6tujs3hflthwdv unique (EMAIL)
  26. Hibernate: insert into Employee (EMAIL, FIRST_NAME, LAST_NAME, ID) values (?, ?, ?, ?)

3. 项目结构和依赖项

以下是此示例的项目结构。

Hiberate 内存数据库 - 图1

如果在设置本示例的 maven 依赖项方面需要任何帮助,请遍历pom.xml文件。

3.1 pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd;
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>ABC</groupId>
  4. <artifactId>ABC</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <packaging>jar</packaging>
  7. <build>
  8. <sourceDirectory>src</sourceDirectory>
  9. <plugins>
  10. <plugin>
  11. <artifactId>maven-compiler-plugin</artifactId>
  12. <version>2.3.2</version>
  13. <configuration>
  14. <source>1.7</source>
  15. <target>1.7</target>
  16. </configuration>
  17. </plugin>
  18. </plugins>
  19. </build>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.hibernate</groupId>
  23. <artifactId>hibernate-core</artifactId>
  24. <version>4.3.6.Final</version>
  25. </dependency>
  26. <!-- for JPA, use hibernate-entitymanager instead of hibernate-core -->
  27. <dependency>
  28. <groupId>org.hibernate</groupId>
  29. <artifactId>hibernate-entitymanager</artifactId>
  30. <version>4.3.6.Final</version>
  31. </dependency>
  32. <!-- optional -->
  33. <dependency>
  34. <groupId>org.hibernate</groupId>
  35. <artifactId>hibernate-osgi</artifactId>
  36. <version>4.3.6.Final</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.hibernate</groupId>
  40. <artifactId>hibernate-envers</artifactId>
  41. <version>4.3.6.Final</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.hibernate</groupId>
  45. <artifactId>hibernate-c3p0</artifactId>
  46. <version>4.3.6.Final</version>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.hibernate</groupId>
  50. <artifactId>hibernate-proxool</artifactId>
  51. <version>4.3.6.Final</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.hibernate</groupId>
  55. <artifactId>hibernate-infinispan</artifactId>
  56. <version>4.3.6.Final</version>
  57. </dependency>
  58. <dependency>
  59. <groupId>org.hibernate</groupId>
  60. <artifactId>hibernate-ehcache</artifactId>
  61. <version>4.3.6.Final</version>
  62. </dependency>
  63. <dependency>
  64. <groupId>antlr</groupId>
  65. <artifactId>antlr</artifactId>
  66. <version>2.7.6</version>
  67. </dependency>
  68. <dependency>
  69. <groupId>commons-collections</groupId>
  70. <artifactId>commons-collections</artifactId>
  71. <version>3.1</version>
  72. </dependency>
  73. <dependency>
  74. <groupId>dom4j</groupId>
  75. <artifactId>dom4j</artifactId>
  76. <version>1.6.1</version>
  77. </dependency>
  78. <dependency>
  79. <groupId>javassist</groupId>
  80. <artifactId>javassist</artifactId>
  81. <version>3.4.GA</version>
  82. </dependency>
  83. <dependency>
  84. <groupId>javax.transaction</groupId>
  85. <artifactId>jta</artifactId>
  86. <version>1.1</version>
  87. </dependency>
  88. <dependency>
  89. <groupId>org.slf4j</groupId>
  90. <artifactId>slf4j-api</artifactId>
  91. <version>1.5.6</version>
  92. </dependency>
  93. <dependency>
  94. <groupId>org.slf4j</groupId>
  95. <artifactId>slf4j-log4j12</artifactId>
  96. <version>1.5.6</version>
  97. </dependency>
  98. <dependency>
  99. <groupId>hsqldb</groupId>
  100. <artifactId>hsqldb</artifactId>
  101. <version>1.8.0.10</version>
  102. </dependency>
  103. </dependencies>
  104. </project>

这就是有关将内存数据库与 Hibernate 结合使用的快速教程的全部内容。

学习愉快!