From 7bcf64fe0f64764d54420cfcb96e62a2e616debd Mon Sep 17 00:00:00 2001 From: Pete Muir Date: Tue, 20 Mar 2012 13:18:56 +0000 Subject: [PATCH] Various * Flatten packages * remove readme.html * remove JBoss repo from POMN * Add -ds.xml support * Remove synthetic ID from hash code and equals * Add unique column on username * use identity based ids * use positive numbers for ids * Add stuff to README --- tasks/README.md | 18 ++--- tasks/pom.xml | 67 +------------------ tasks/readme.html | 59 ---------------- .../tasks/{beans => }/Resources.java | 15 ++++- .../quickstarts/tasks/{domain => }/Task.java | 43 +++++------- .../tasks/{domain => }/TaskDao.java | 4 +- .../tasks/{domain => }/TaskDaoImpl.java | 4 +- .../quickstarts/tasks/{domain => }/User.java | 40 +++++------ .../tasks/{domain => }/UserDao.java | 2 +- .../tasks/{domain => }/UserDaoImpl.java | 2 +- .../quickstarts/tasks/DefaultDeployment.java | 13 ++-- .../as/quickstarts/tasks/TaskDaoTest.java | 15 ++--- .../as/quickstarts/tasks/UserDaoTest.java | 6 +- .../resources/META-INF/test-persistence.xml | 20 ++++++ tasks/src/test/resources/import.sql | 8 +-- tasks/src/test/resources/persistence.xml | 13 ---- tasks/src/test/resources/test-ds.xml | 21 ++++++ 17 files changed, 117 insertions(+), 233 deletions(-) delete mode 100644 tasks/readme.html rename tasks/src/main/java/org/jboss/as/quickstarts/tasks/{beans => }/Resources.java (57%) rename tasks/src/main/java/org/jboss/as/quickstarts/tasks/{domain => }/Task.java (64%) rename tasks/src/main/java/org/jboss/as/quickstarts/tasks/{domain => }/TaskDao.java (78%) rename tasks/src/main/java/org/jboss/as/quickstarts/tasks/{domain => }/TaskDaoImpl.java (91%) rename tasks/src/main/java/org/jboss/as/quickstarts/tasks/{domain => }/User.java (61%) rename tasks/src/main/java/org/jboss/as/quickstarts/tasks/{domain => }/UserDao.java (83%) rename tasks/src/main/java/org/jboss/as/quickstarts/tasks/{domain => }/UserDaoImpl.java (94%) create mode 100644 tasks/src/test/resources/META-INF/test-persistence.xml delete mode 100644 tasks/src/test/resources/persistence.xml create mode 100644 tasks/src/test/resources/test-ds.xml diff --git a/tasks/README.md b/tasks/README.md index bda0de4be5..e30e8d9666 100644 --- a/tasks/README.md +++ b/tasks/README.md @@ -1,5 +1,7 @@ -jboss-as-tasks -============== +tasks: Testing JPA with Arquillian +================================== + +Authors: Oliver Kiss and Lukas Fryc What is it? ----------- @@ -48,16 +50,8 @@ test goal with the following profile activated: Testing on Managed Server ------------------------- -Arquillian will start the container for you. All you have to do is setup a path to your -extracted . To do this, run - - export JBOSS_HOME=/path/to/jboss-as - -or if you are using windows - - set JBOSS_HOME=X:\path\to\jboss-as - -Or hardcode the path in pom.xml file +Arquillian will start the container for you. All you have to do is setup a path to JBoss AS. +Edit `src/test/resources/arquillian` and set the `jbossHome` element. To run the test in JBoss AS 7 or JBoss EAP 6, run the test goal with the following profile activated: diff --git a/tasks/pom.xml b/tasks/pom.xml index 8bd4b271b8..7b1a2d1aa1 100644 --- a/tasks/pom.xml +++ b/tasks/pom.xml @@ -160,40 +160,8 @@ + - - - - - - jboss-public-repository - JBoss Repository - http://repository.jboss.org/nexus/content/groups/public - - - - - false - - - - - - - jboss-public-repository - JBoss Repository - http://repository.jboss.org/nexus/content/groups/public - - - - false - - - - - - - - - jboss-public-repository - JBoss Repository - http://repository.jboss.org/nexus/content/groups/public - - - - - false - - - - - - - jboss-public-repository - JBoss Repository - http://repository.jboss.org/nexus/content/groups/public - - - - false - - - - diff --git a/tasks/readme.html b/tasks/readme.html deleted file mode 100644 index fb37a502d3..0000000000 --- a/tasks/readme.html +++ /dev/null @@ -1,59 +0,0 @@ -

jboss-as-tasks

-

What is it?

-

This is your project! It's a sample, Maven 3 project to help you - get your foot in the door developing with Java EE 6 on JBoss AS 7 or JBoss EAP 6. - This project is setup to allow you to use JPA 2.0. - It includes a persistence unit and some sample persistence code to help - you get your feet wet with database access in enterprise Java.

-

It does not contain an user interface layer. The main purpose of the project is - to show you how to test JPA with Arquillian.

-

System requirements

-

All you need to build this project is Java 6.0 (Java SDK 1.6) or better, Maven - 3.0 or better.

-

You will use a real server to test internals of your application with Arquillian.

-

Running the Arquillian tests

-

By default, tests are configured to be skipped. The reason is that the sample - test is an Arquillian test, which requires the use of a container. You can - activate this test by selecting one of the container configuration provided - for JBoss AS 7 / JBoss EAP 6 (remote).

-

Testing on Remote Server

-

First you need to start JBoss AS 7 or JBoss EAP6. To do this, run

-
$JBOSS_HOME/bin/standalone.sh
-
-

or if you are using windows

-
$JBOSS_HOME/bin/standalone.bat
-
-

To run the test in JBoss AS 7, first start a JBoss AS 7 or JBoss EAP 6 instance. Then, run the - test goal with the following profile activated:

-
mvn clean test -Parq-jbossas-remote
-
-

Testing on Managed Server

-

Arquillian will start the container for you. All you have to do is setup a path to your - extracted . To do this, run

-
export JBOSS_HOME=/path/to/jboss-as
-
-

or if you are using windows

-
set JBOSS_HOME=X:\path\to\jboss-as
-
-

Or hardcode the path in pom.xml file

-

To run the test in JBoss AS 7 or JBoss EAP 6, run the test goal with the following profile activated:

-
mvn clean test -Parq-jbossas-managed
-
-

Importing the project into an IDE

-

If you created the project using the Maven archetype wizard in your IDE - (Eclipse, NetBeans or IntelliJ IDEA), then there is nothing to do. You should - already have an IDE project.

-

If you created the project from the commandline using archetype:generate, then - you need to import the project into your IDE. If you are using NetBeans 6.8 or - IntelliJ IDEA 9, then all you have to do is open the project as an existing - project. Both of these IDEs recognize Maven projects natively.

-

Detailed instructions for using Eclipse with JBoss AS 7 are provided in the - JBoss AS 7 Getting Started Guide for Developers.

-

Downloading the sources and Javadocs

-

If you want to be able to debug into the source code or look at the Javadocs - of any library in the project, you can run either of the following two - commands to pull them into your local repository. The IDE should then detect - them.

-
mvn dependency:sources
-    mvn dependency:resolve -Dclassifier=javadoc
-
\ No newline at end of file diff --git a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/beans/Resources.java b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/Resources.java similarity index 57% rename from tasks/src/main/java/org/jboss/as/quickstarts/tasks/beans/Resources.java rename to tasks/src/main/java/org/jboss/as/quickstarts/tasks/Resources.java index abee1ef2ea..056261cb7e 100644 --- a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/beans/Resources.java +++ b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/Resources.java @@ -1,4 +1,4 @@ -package org.jboss.as.quickstarts.tasks.beans; +package org.jboss.as.quickstarts.tasks; import javax.ejb.Stateful; import javax.enterprise.context.RequestScoped; @@ -7,6 +7,19 @@ import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContextType; +/** + * This class uses CDI to alias Java EE resources, such as the persistence context, to CDI beans. As it is a stateful bean, it + * can produce extended persistence contexts. + * + *

+ * Example injection on a managed bean field: + *

+ * + *
+ * @Inject
+ * private EntityManager em;
+ * 
+ */ @Stateful @RequestScoped public class Resources { diff --git a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/Task.java b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/Task.java similarity index 64% rename from tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/Task.java rename to tasks/src/main/java/org/jboss/as/quickstarts/tasks/Task.java index bb98b56f1c..14c925e3a6 100644 --- a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/Task.java +++ b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/Task.java @@ -1,4 +1,6 @@ -package org.jboss.as.quickstarts.tasks.domain; +package org.jboss.as.quickstarts.tasks; + +import static javax.persistence.GenerationType.IDENTITY; import javax.persistence.*; import java.io.Serializable; @@ -8,13 +10,12 @@ * * @author Oliver Kiss */ +@SuppressWarnings("serial") @Entity -@Table(name = "Tasks_task") public class Task implements Serializable { - private static final long serialVersionUID = 1l; @Id - @GeneratedValue + @GeneratedValue(strategy = IDENTITY) private Long id; @ManyToOne @@ -58,45 +59,31 @@ public void setTitle(String title) { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - result = prime * result + ((title == null) ? 0 : title.hashCode()); result = prime * result + ((owner == null) ? 0 : owner.hashCode()); + result = prime * result + ((title == null) ? 0 : title.hashCode()); return result; } @Override public boolean equals(Object obj) { - if (this == obj) { + if (this == obj) return true; - } - if (obj == null) { + if (obj == null) return false; - } - if (getClass() != obj.getClass()) { + if (getClass() != obj.getClass()) return false; - } Task other = (Task) obj; - if (id == null) { - if (other.id != null) { + if (owner == null) { + if (other.owner != null) return false; - } - } else if (!id.equals(other.id)) { + } else if (!owner.equals(other.owner)) return false; - } if (title == null) { - if (other.title != null) { + if (other.title != null) return false; - } - } else if (!title.equals(other.title)) { + } else if (!title.equals(other.title)) return false; - } - if (owner == null) { - if (other.owner != null) { - return false; - } - } else if (!owner.equals(other.owner)) { - return false; - } return true; } + } diff --git a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/TaskDao.java b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/TaskDao.java similarity index 78% rename from tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/TaskDao.java rename to tasks/src/main/java/org/jboss/as/quickstarts/tasks/TaskDao.java index d3711f2cc5..c6eb2b776a 100644 --- a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/TaskDao.java +++ b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/TaskDao.java @@ -1,11 +1,11 @@ -package org.jboss.as.quickstarts.tasks.domain; +package org.jboss.as.quickstarts.tasks; import java.util.List; import javax.ejb.Local; /** - * Basic operations for manipulation with tasks + * Basic operations for manipulation of tasks * * @author Lukas Fryc * diff --git a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/TaskDaoImpl.java b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/TaskDaoImpl.java similarity index 91% rename from tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/TaskDaoImpl.java rename to tasks/src/main/java/org/jboss/as/quickstarts/tasks/TaskDaoImpl.java index 3a9a0b5f36..caa4bd41ef 100644 --- a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/TaskDaoImpl.java +++ b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/TaskDaoImpl.java @@ -1,4 +1,4 @@ -package org.jboss.as.quickstarts.tasks.domain; +package org.jboss.as.quickstarts.tasks; import java.util.List; @@ -8,7 +8,7 @@ import javax.persistence.TypedQuery; /** - * Provides functionality for manipulation with tasks using persistence context from {@link Resources}. + * Provides functionality for manipulation with tasks using the persistence context from {@link Resources}. * * @author Lukas Fryc * @author Oliver Kiss diff --git a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/User.java b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/User.java similarity index 61% rename from tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/User.java rename to tasks/src/main/java/org/jboss/as/quickstarts/tasks/User.java index 100d15319f..2659b17336 100644 --- a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/User.java +++ b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/User.java @@ -1,4 +1,7 @@ -package org.jboss.as.quickstarts.tasks.domain; +package org.jboss.as.quickstarts.tasks; + +import static javax.persistence.CascadeType.ALL; +import static javax.persistence.GenerationType.IDENTITY; import javax.persistence.*; import java.io.Serializable; @@ -10,20 +13,19 @@ * * @author Oliver Kiss */ +@SuppressWarnings("serial") @Entity -@Table(name = "Tasks_user") public class User implements Serializable { - private static final long serialVersionUID = 1l; - @Id - @GeneratedValue(strategy = GenerationType.TABLE) + @GeneratedValue(strategy = IDENTITY) private Long id; + @Column(unique=true) private String username; - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "owner") - @Column(nullable = true, updatable = false) + @OneToMany(cascade = ALL, mappedBy = "owner") + @Column(updatable = false) private List tasks = new ArrayList(); public User() { @@ -61,37 +63,25 @@ public void setTasks(List tasks) { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((username == null) ? 0 : username.hashCode()); return result; } @Override public boolean equals(Object obj) { - if (this == obj) { + if (this == obj) return true; - } - if (obj == null) { + if (obj == null) return false; - } - if (getClass() != obj.getClass()) { + if (getClass() != obj.getClass()) return false; - } User other = (User) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } if (username == null) { - if (other.username != null) { + if (other.username != null) return false; - } - } else if (!username.equals(other.username)) { + } else if (!username.equals(other.username)) return false; - } return true; } + } diff --git a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/UserDao.java b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/UserDao.java similarity index 83% rename from tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/UserDao.java rename to tasks/src/main/java/org/jboss/as/quickstarts/tasks/UserDao.java index 580df9bbfe..9ea4f90b18 100644 --- a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/UserDao.java +++ b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/UserDao.java @@ -1,4 +1,4 @@ -package org.jboss.as.quickstarts.tasks.domain; +package org.jboss.as.quickstarts.tasks; import javax.ejb.Local; diff --git a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/UserDaoImpl.java b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/UserDaoImpl.java similarity index 94% rename from tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/UserDaoImpl.java rename to tasks/src/main/java/org/jboss/as/quickstarts/tasks/UserDaoImpl.java index 1706e4846d..1fb700261f 100644 --- a/tasks/src/main/java/org/jboss/as/quickstarts/tasks/domain/UserDaoImpl.java +++ b/tasks/src/main/java/org/jboss/as/quickstarts/tasks/UserDaoImpl.java @@ -1,4 +1,4 @@ -package org.jboss.as.quickstarts.tasks.domain; +package org.jboss.as.quickstarts.tasks; import java.util.List; diff --git a/tasks/src/test/java/org/jboss/as/quickstarts/tasks/DefaultDeployment.java b/tasks/src/test/java/org/jboss/as/quickstarts/tasks/DefaultDeployment.java index e6a7fc77c6..c5757afa9c 100644 --- a/tasks/src/test/java/org/jboss/as/quickstarts/tasks/DefaultDeployment.java +++ b/tasks/src/test/java/org/jboss/as/quickstarts/tasks/DefaultDeployment.java @@ -2,14 +2,17 @@ import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; -import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; public class DefaultDeployment { - public static JavaArchive deployment() { - return ShrinkWrap.create(JavaArchive.class, "test.jar").addPackages(true, "org/jboss/as/quickstarts/tasks") - .addAsResource("persistence.xml", "META-INF/persistence.xml") - .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml").addAsResource("import.sql"); + public static WebArchive deployment() { + return ShrinkWrap.create(WebArchive.class, "test.war") + .addPackages(true, Task.class.getPackage().getName()) + .addAsResource("META-INF/test-persistence.xml", "META-INF/persistence.xml") + .addAsWebInfResource("test-ds.xml", "test-ds.xml") + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") + .addAsResource("import.sql"); } } diff --git a/tasks/src/test/java/org/jboss/as/quickstarts/tasks/TaskDaoTest.java b/tasks/src/test/java/org/jboss/as/quickstarts/tasks/TaskDaoTest.java index b310d4df00..1330aaea3f 100644 --- a/tasks/src/test/java/org/jboss/as/quickstarts/tasks/TaskDaoTest.java +++ b/tasks/src/test/java/org/jboss/as/quickstarts/tasks/TaskDaoTest.java @@ -11,10 +11,7 @@ import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; -import org.jboss.as.quickstarts.tasks.domain.Task; -import org.jboss.as.quickstarts.tasks.domain.TaskDao; -import org.jboss.as.quickstarts.tasks.domain.User; -import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -27,7 +24,7 @@ public class TaskDaoTest { @Deployment - public static JavaArchive deployment() throws IllegalArgumentException, FileNotFoundException { + public static WebArchive deployment() throws IllegalArgumentException, FileNotFoundException { return DefaultDeployment.deployment(); } @@ -42,7 +39,7 @@ public static JavaArchive deployment() throws IllegalArgumentException, FileNotF @Before public void setUp() throws Exception { detachedUser = new User("jdoe"); - detachedUser.setId(-1L); + detachedUser.setId(1L); } @Test @@ -54,7 +51,7 @@ public void user_should_be_created_with_one_task_attached() throws Exception { // when em.persist(user); taskDao.createTask(user, task); - List userTasks = em.createQuery("SELECT t FROM Task t WHERE t.owner = ?", Task.class).setParameter(1, user) + List userTasks = em.createQuery("SELECT t FROM Task t WHERE t.owner = :owner", Task.class).setParameter("owner", user) .getResultList(); // then @@ -64,7 +61,6 @@ public void user_should_be_created_with_one_task_attached() throws Exception { @Test public void all_tasks_should_be_obtained_from_detachedUser() { - // given // when List userTasks = taskDao.getAll(detachedUser); @@ -74,7 +70,6 @@ public void all_tasks_should_be_obtained_from_detachedUser() { @Test public void range_of_tasks_should_be_provided_by_taskDao() { - // given // when List headOfTasks = taskDao.getRange(detachedUser, 0, 1); List tailOfTasks = taskDao.getRange(detachedUser, 1, 1); @@ -103,7 +98,7 @@ public void taskDao_should_provide_basic_case_insensitive_full_text_search() { public void taskDao_should_remove_task_from_detachedUser() { // given Task task = new Task(); - task.setId(-1L); + task.setId(1L); task.setOwner(detachedUser); assertEquals(2, taskDao.getAll(detachedUser).size()); diff --git a/tasks/src/test/java/org/jboss/as/quickstarts/tasks/UserDaoTest.java b/tasks/src/test/java/org/jboss/as/quickstarts/tasks/UserDaoTest.java index 1cc2767e77..aa471b5b40 100644 --- a/tasks/src/test/java/org/jboss/as/quickstarts/tasks/UserDaoTest.java +++ b/tasks/src/test/java/org/jboss/as/quickstarts/tasks/UserDaoTest.java @@ -10,9 +10,7 @@ import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; -import org.jboss.as.quickstarts.tasks.domain.User; -import org.jboss.as.quickstarts.tasks.domain.UserDao; -import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -25,7 +23,7 @@ public class UserDaoTest { @Deployment - public static JavaArchive deployment() throws IllegalArgumentException, FileNotFoundException { + public static WebArchive deployment() throws IllegalArgumentException, FileNotFoundException { return DefaultDeployment.deployment(); } diff --git a/tasks/src/test/resources/META-INF/test-persistence.xml b/tasks/src/test/resources/META-INF/test-persistence.xml new file mode 100644 index 0000000000..45b6901545 --- /dev/null +++ b/tasks/src/test/resources/META-INF/test-persistence.xml @@ -0,0 +1,20 @@ + + + + + + java:jboss/datasources/TasksQuickstartTestDS + + + + + + + \ No newline at end of file diff --git a/tasks/src/test/resources/import.sql b/tasks/src/test/resources/import.sql index 4e76854142..0d982a121d 100644 --- a/tasks/src/test/resources/import.sql +++ b/tasks/src/test/resources/import.sql @@ -1,9 +1,9 @@ BEGIN -INSERT INTO Tasks_user (ID, USERNAME) VALUES (-1, 'jdoe'); -INSERT INTO Tasks_user (ID, USERNAME) VALUES (-2, 'emuster'); +INSERT INTO User (ID, USERNAME) VALUES (1, 'jdoe'); +INSERT INTO User (ID, USERNAME) VALUES (2, 'emuster'); COMMIT BEGIN -INSERT INTO Tasks_task (ID, OWNER_ID, TITLE) VALUES (-1, -1, 'johns first task'); -INSERT INTO Tasks_task (ID, OWNER_ID, TITLE) VALUES (-2, -1, 'johns second task'); +INSERT INTO Task (ID, OWNER_ID, TITLE) VALUES (1, 1, 'johns first task'); +INSERT INTO Task (ID, OWNER_ID, TITLE) VALUES (2, 1, 'johns second task'); COMMIT \ No newline at end of file diff --git a/tasks/src/test/resources/persistence.xml b/tasks/src/test/resources/persistence.xml deleted file mode 100644 index 4f53a5ef23..0000000000 --- a/tasks/src/test/resources/persistence.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - java:jboss/datasources/ExampleDS - - - - - - \ No newline at end of file diff --git a/tasks/src/test/resources/test-ds.xml b/tasks/src/test/resources/test-ds.xml new file mode 100644 index 0000000000..5565c34499 --- /dev/null +++ b/tasks/src/test/resources/test-ds.xml @@ -0,0 +1,21 @@ + + + + + + jdbc:h2:mem:tasks-quickstart-test;DB_CLOSE_DELAY=-1 + h2 + + sa + sa + + + + \ No newline at end of file