Merge pull request #3 from fiammara/master

Spring data
diff --git a/juneau-petstore-api/src/main/java/org/apache/juneau/petstore/dto/Pet.java b/juneau-petstore-api/src/main/java/org/apache/juneau/petstore/dto/Pet.java
index cb9dff0..ea19272 100644
--- a/juneau-petstore-api/src/main/java/org/apache/juneau/petstore/dto/Pet.java
+++ b/juneau-petstore-api/src/main/java/org/apache/juneau/petstore/dto/Pet.java
@@ -53,8 +53,8 @@
 	@Schema(description="Pet species.")
 	private Species species;
 
-	@ElementCollection @OrderColumn
-	@Schema(description="Pet attributes.", example="friendly,smart")
+	@ElementCollection(fetch=FetchType.EAGER) @OrderColumn
+	@Schema(description="Pet attributes.", example="friendly,smart")	
 	private List<String> tags;
 
 	@Column @Enumerated(STRING)
diff --git a/juneau-petstore-server/pom.xml b/juneau-petstore-server/pom.xml
index f629098..3f80536 100644
--- a/juneau-petstore-server/pom.xml
+++ b/juneau-petstore-server/pom.xml
@@ -62,12 +62,13 @@
             <version>${juneau.version}</version>
         </dependency>
 
-        <!-- Needed for @Inject support -->
-        <dependency>
-            <groupId>javax.inject</groupId>
-            <artifactId>javax.inject</artifactId>
-            <version>${javax.inject.version}</version>
-        </dependency>
+
+		<!-- Needed for @Inject support -->
+		<dependency>
+			<groupId>javax.inject</groupId>
+			<artifactId>javax.inject</artifactId>
+			<version>${javax.inject.version}</version>
+		</dependency>
 
         <!-- Needed for JPA persistence of PetStore beans -->
         <dependency>
@@ -86,6 +87,10 @@
             <groupId>xml-apis</groupId>
             <artifactId>xml-apis</artifactId>
         </dependency>
+         <dependency>
+            <groupId>org.springframework.boot</groupId>
+		    <artifactId>spring-boot-starter-data-jpa</artifactId>	 
+        </dependency>
 
     </dependencies>
 
diff --git a/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/App.java b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/App.java
index e79b507..b26eba7 100644
--- a/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/App.java
+++ b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/App.java
@@ -15,11 +15,13 @@
 import org.apache.juneau.rest.springboot.JuneauRestInitializer;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 
 /**
  * Entry point for PetStore application.
  */
 @SpringBootApplication
+@EnableJpaRepositories(basePackages = "org.apache.juneau.petstore")
 @SuppressWarnings("javadoc")
 public class App {
 
diff --git a/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/repository/OrderRepository.java b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/repository/OrderRepository.java
new file mode 100644
index 0000000..7fd1545
--- /dev/null
+++ b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/repository/OrderRepository.java
@@ -0,0 +1,10 @@
+package org.apache.juneau.petstore.repository;
+
+import org.apache.juneau.petstore.dto.Order;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface OrderRepository  extends JpaRepository <Order, Long>{
+
+}
diff --git a/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/repository/PetRepository.java b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/repository/PetRepository.java
new file mode 100644
index 0000000..49e125b
--- /dev/null
+++ b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/repository/PetRepository.java
@@ -0,0 +1,19 @@
+package org.apache.juneau.petstore.repository;
+
+import java.util.List;
+
+import org.apache.juneau.petstore.dto.Pet;
+import org.apache.juneau.petstore.dto.PetStatus;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PetRepository extends JpaRepository <Pet, Long> {
+	@Query("select X from PetstorePet X where X.tags in :tags")
+	  List<Pet> findByTags(@Param("tags") String[] tags);
+	
+	@Query("select X from PetstorePet X where X.status in :status")
+	  List<Pet> findByStatus(@Param("status") PetStatus[] status);
+}
diff --git a/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/repository/UserRepository.java b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/repository/UserRepository.java
new file mode 100644
index 0000000..76948ea
--- /dev/null
+++ b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/repository/UserRepository.java
@@ -0,0 +1,14 @@
+package org.apache.juneau.petstore.repository;
+
+
+
+import org.apache.juneau.petstore.dto.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserRepository  extends JpaRepository <User, Long>{
+	
+	User findByUsername(String username);
+	Long deleteByUsername(String username);
+}
diff --git a/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/service/AbstractPersistenceService.java b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/service/AbstractPersistenceService.java
deleted file mode 100644
index 6bacab0..0000000
--- a/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/service/AbstractPersistenceService.java
+++ /dev/null
@@ -1,275 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.petstore.service;
-
-import java.util.*;
-
-import javax.persistence.*;
-
-import org.apache.juneau.pojotools.*;
-
-/**
- * Superclass for DAOs that use the JPA entity manager.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-public class AbstractPersistenceService {
-
-	private final EntityManagerFactory entityManagerFactory;
-
-	/**
-	 * Constructor.
-	 */
-	public AbstractPersistenceService() {
-		entityManagerFactory = Persistence.createEntityManagerFactory("test");
-	}
-
-	/**
-	 * Retrieves an entity manager session.
-	 *
-	 * @return The entity manager session.
-	 */
-	protected EntityManager getEntityManager() {
-		return entityManagerFactory.createEntityManager();
-	}
-
-	/**
-	 * Retrieves the specified JPA bean from the repository.
-	 *
-	 * @param em The entity manager to use to retrieve the bean.
-	 * @param t The bean type to retrieve.
-	 * @param id The primary key value.
-	 * @return The JPA bean, or null if not found.
-	 */
-	protected <T> T find(EntityManager em, Class<T> t, Object id) {
-		return em.find(t, id);
-	}
-
-	/**
-	 * Same as {@link #find(EntityManager, Class, Object)} but uses a new entity manager.
-	 *
-	 * @param t The bean type to retrieve.
-	 * @param id The primary key value.
-	 * @return The JPA bean, or null if not found.
-	 */
-	protected <T> T find(Class<T> t, Object id) {
-		return find(getEntityManager(), t, id);
-	}
-
-	/**
-	 * Store the specified JPA bean in the repository.
-	 *
-	 * @param em The entity manager to use to store and merge the bean.
-	 * @param t The bean to store.
-	 * @return The merged JPA bean returned by the {@link EntityManager#merge(Object)} method, or null if the bean was null.
-	 */
-	protected <T> T merge(EntityManager em, T t) {
-		if (t == null)
-			return null;
-		try {
-			EntityTransaction et = em.getTransaction();
-			et.begin();
-			t = em.merge(t);
-			et.commit();
-			return t;
-		} finally {
-			em.close();
-		}
-	}
-
-	/**
-	 * Same as {@link #merge(EntityManager, Object)} but uses a new entity manager.
-	 *
-	 * @param t The bean to store.
-	 * @return The merged JPA bean returned by the {@link EntityManager#merge(Object)} method, or null if the bean was null.
-	 */
-	protected <T> T merge(T t) {
-		return merge(getEntityManager(), t);
-	}
-
-	/**
-	 * Store the specified JPA beans in the repository.
-	 *
-	 * All values are persisted in the same transaction.
-	 *
-	 * @param em The entity manager to use to store and merge the beans.
-	 * @param c The collection of beans to store.
-	 * @return The merged JPA beans returned by the {@link EntityManager#merge(Object)} method.
-	 */
-	protected <T> Collection<T> merge(EntityManager em, Collection<T> c) {
-		Collection<T> c2 = new ArrayList<>();
-		try {
-			EntityTransaction et = em.getTransaction();
-			et.begin();
-			for (T t : c)
-				c2.add(em.merge(t));
-			et.commit();
-			return c2;
-		} finally {
-			em.close();
-		}
-	}
-
-	/**
-	 * Same as {@link #merge(EntityManager, Collection)} but uses a new entity manager.
-	 *
-	 * @param c The collection of beans to store.
-	 * @return The merged JPA beans returned by the {@link EntityManager#merge(Object)} method.
-	 */
-	protected <T> Collection<T> merge(Collection<T> c) {
-		return merge(getEntityManager(), c);
-	}
-
-	/**
-	 * Remove the specified JPA bean from the repository.
-	 *
-	 * @param t The bean type to remove.
-	 * @param id The primary key value.
-	 */
-	protected <T> void remove(Class<T> t, Object id) {
-		EntityManager em = getEntityManager();
-		remove(em, find(em, t, id));
-	}
-
-	/**
-	 * Remove the specified JPA bean from the repository.
-	 *
-	 * @param em The entity manager used to retrieve the bean.
-	 * @param t The bean to remove.  Can be null.
-	 */
-	protected <T> void remove(EntityManager em, T t) {
-		if (t == null)
-			return;
-		try {
-			EntityTransaction et = em.getTransaction();
-			et.begin();
-			em.remove(t);
-			et.commit();
-		} finally {
-			em.close();
-		}
-	}
-
-	/**
-	 * Runs a JPA query and returns the results.
-	 *
-	 * @param <T> The bean type.
-	 * @param em The entity manager to use to retrieve the beans.
-	 * @param query The JPA query.
-	 * @param t The bean type.
-	 * @param searchArgs Optional search arguments.
-	 * @param pageArgs Optional paging arguments.
-	 * @return The results.
-	 */
-	protected <T> List<T> query(EntityManager em, String query, Class<T> t, SearchArgs searchArgs, PageArgs pageArgs) {
-		TypedQuery<T> q = em.createQuery(query, t);
-		if (pageArgs != null) {
-			q.setMaxResults(pageArgs.getLimit() == 0 ? 100 : pageArgs.getLimit());
-			q.setFirstResult(pageArgs.getPosition());
-		}
-		return em.createQuery(query, t).getResultList();
-	}
-
-	/**
-	 * Same as {@link #query(EntityManager,String,Class,SearchArgs,PageArgs)} but uses a new entity manager.
-	 *
-	 * @param <T> The bean type.
-	 * @param query The JPA query.
-	 * @param t The bean type.
-	 * @param searchArgs Optional search arguments.
-	 * @param pageArgs Optional paging arguments.
-	 * @return The results.
-	 */
-	protected <T> List<T> query(String query, Class<T> t, SearchArgs searchArgs, PageArgs pageArgs) {
-		return query(getEntityManager(), query, t, searchArgs, pageArgs);
-	}
-
-	/**
-	 * Runs a JPA parameterized query and returns the results.
-	 *
-	 * @param em The entity manager to use to retrieve the beans.
-	 * @param query The JPA query.
-	 * @param t The bean type.
-	 * @param params The query parameter values.
-	 * @return The results.
-	 */
-	protected <T> List<T> query(EntityManager em, String query, Class<T> t, Map<String,Object> params) {
-		TypedQuery<T> tq = em.createQuery(query, t);
-		for (Map.Entry<String,Object> e : params.entrySet()) {
-			tq.setParameter(e.getKey(), e.getValue());
-		}
-		return tq.getResultList();
-	}
-
-	/**
-	 * Same as {@link #query(EntityManager,String,Class,Map)} but uses a new entity manager.
-	 *
-	 * @param query The JPA query.
-	 * @param t The bean type.
-	 * @param params The query parameter values.
-	 * @return The results.
-	 */
-	protected <T> List<T> query(String query, Class<T> t, Map<String,Object> params) {
-		return query(getEntityManager(), query, t, params);
-	}
-
-	/**
-	 * Runs a JPA update statement.
-	 *
-	 * @param em The entity manager to use to run the statement.
-	 * @param query The JPA update statement.
-	 * @return The number of rows modified.
-	 */
-	protected int update(EntityManager em, String query) {
-		return em.createQuery(query).executeUpdate();
-	}
-
-	/**
-	 * Same as {@link #update(EntityManager,String)} but uses a new entity manager.
-	 *
-	 * @param query The JPA update statement.
-	 * @return The number of rows modified.
-	 */
-	protected int update(String query) {
-		return update(getEntityManager(), query);
-	}
-
-	/**
-	 * Runs a JPA parameterized update statement.
-	 *
-	 * @param em The entity manager to use to run the statement.
-	 * @param query The JPA update statement.
-	 * @param params The query parameter values.
-	 * @return The number of rows modified.
-	 */
-	protected int update(EntityManager em, String query, Map<String,Object> params) {
-		Query q = em.createQuery(query);
-		for (Map.Entry<String,Object> e : params.entrySet()) {
-			q.setParameter(e.getKey(), e.getValue());
-		}
-		return q.executeUpdate();
-	}
-
-	/**
-	 * Same as {@link #update(EntityManager,String,Map)} but uses a new entity manager.
-	 *
-	 * @param query The JPA update statement.
-	 * @param params The query parameter values.
-	 * @return The number of rows modified.
-	 */
-	protected int update(String query, Map<String,Object> params) {
-		return update(getEntityManager(), query, params);
-	}
-}
diff --git a/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/service/PetStoreService.java b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/service/PetStoreService.java
index ac83c4c..f633983 100644
--- a/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/service/PetStoreService.java
+++ b/juneau-petstore-server/src/main/java/org/apache/juneau/petstore/service/PetStoreService.java
@@ -17,13 +17,18 @@
 import java.io.*;
 import java.util.*;
 
-import javax.persistence.*;
 
 import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.petstore.dto.*;
-import org.apache.juneau.pojotools.*;
-import org.apache.juneau.pojotools.SearchArgs;
+import org.apache.juneau.petstore.repository.OrderRepository;
+import org.apache.juneau.petstore.repository.PetRepository;
+import org.apache.juneau.petstore.repository.UserRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+
+
 
 /**
  * Pet store database application.
@@ -35,8 +40,17 @@
  * 	<li class='extlink'>{@source}
  * </ul>
  */
-public class PetStoreService extends AbstractPersistenceService {
+public class PetStoreService {
 
+	
+	@Autowired
+	private PetRepository petRepository;
+	
+	@Autowired
+	private UserRepository userRepository;
+	
+	@Autowired
+	private OrderRepository orderRepository;
 	//-----------------------------------------------------------------------------------------------------------------
 	// Initialization methods.
 	//-----------------------------------------------------------------------------------------------------------------
@@ -51,43 +65,36 @@
 	 */
 	public PetStoreService initDirect(PrintWriter w) throws ParseException, IOException {
 
-		EntityManager em = getEntityManager();
-		EntityTransaction et = em.getTransaction();
+		
 		JsonParser parser = JsonParser.create().build();
 
-		et.begin();
-
-		for (Pet x : em.createQuery("select X from PetstorePet X", Pet.class).getResultList()) {
-			em.remove(x);
+		for (Pet x : petRepository.findAll()) {
+			petRepository.delete(x);
 			w.println(format("Deleted pet:  id={0}", x.getId()));
 		}
-		for (Order x : em.createQuery("select X from PetstoreOrder X", Order.class).getResultList()) {
-			em.remove(x);
+		for (Order x : orderRepository.findAll()) {
+			orderRepository.delete(x);
 			w.println(format("Deleted order:  id={0}", x.getId()));
 		}
-		for (User x : em.createQuery("select X from PetstoreUser X", User.class).getResultList()) {
-			em.remove(x);
+		for (User x : userRepository.findAll()) {
+			userRepository.delete(x);
 			w.println(format("Deleted user:  username={0}", x.getUsername()));
 		}
-
-		et.commit();
-		et.begin();
+		
 
 		for (Pet x : parser.parse(getStream("init/Pets.json"), Pet[].class)) {
-			x = em.merge(x);
+			petRepository.save(x);
 			w.println(format("Created pet:  id={0}, name={1}", x.getId(), x.getName()));
 		}
 		for (Order x : parser.parse(getStream("init/Orders.json"), Order[].class)) {
-			x = em.merge(x);
+			orderRepository.save(x);
 			w.println(format("Created order:  id={0}", x.getId()));
 		}
 		for (User x: parser.parse(getStream("init/Users.json"), User[].class)) {
-			x = em.merge(x);
+			userRepository.save(x);
 			w.println(format("Created user:  username={0}", x.getUsername()));
 		}
 
-		et.commit();
-
 		return this;
 	}
 
@@ -104,7 +111,7 @@
 	 * @throws IdNotFound If pet was not found.
 	 */
 	public Pet getPet(long id) throws IdNotFound {
-		return find(Pet.class, id);
+		return petRepository.findById(id).get();
 	}
 
 	/**
@@ -115,7 +122,7 @@
 	 * @throws IdNotFound If order was not found.
 	 */
 	public Order getOrder(long id) throws IdNotFound {
-		return find(Order.class, id);
+		return orderRepository.findById(id).get();
 	}
 
 	/**
@@ -128,7 +135,7 @@
 	 */
 	public User getUser(String username) throws InvalidUsername, IdNotFound  {
 		assertValidUsername(username);
-		return find(User.class, username);
+		return userRepository.findByUsername(username);
 	}
 
 	/**
@@ -137,7 +144,7 @@
 	 * @return All pets in the database.
 	 */
 	public List<Pet> getPets() {
-		return query("select X from PetstorePet X", Pet.class, (SearchArgs)null, (PageArgs)null);
+		return petRepository.findAll();
 	}
 
 	/**
@@ -146,7 +153,7 @@
 	 * @return All orders in the database.
 	 */
 	public List<Order> getOrders() {
-		return query("select X from PetstoreOrder X", Order.class, (SearchArgs)null, (PageArgs)null);
+		return orderRepository.findAll();
 	}
 
 	/**
@@ -155,7 +162,7 @@
 	 * @return All users in the database.
 	 */
 	public List<User> getUsers() {
-		return query("select X from PetstoreUser X", User.class, (SearchArgs)null, (PageArgs)null);
+		return userRepository.findAll();
 	}
 
 	/**
@@ -164,8 +171,8 @@
 	 * @param c The pet input data.
 	 * @return a new {@link Pet} object.
 	 */
-	public Pet create(CreatePet c) {
-		return merge(new Pet().status(PetStatus.AVAILABLE).apply(c));
+	public Pet create(CreatePet c) {	
+		return petRepository.save((new Pet().status(PetStatus.AVAILABLE).apply(c)));
 	}
 
 	/**
@@ -175,7 +182,7 @@
 	 * @return a new {@link Order} object.
 	 */
 	public Order create(CreateOrder c) {
-		return merge(new Order().status(OrderStatus.PLACED).apply(c));
+		return orderRepository.save((new Order().status(OrderStatus.PLACED).apply(c)));
 	}
 
 	/**
@@ -185,7 +192,7 @@
 	 * @return a new {@link User} object.
 	 */
 	public User create(User c) {
-		return merge(new User().apply(c));
+		return userRepository.save((new User().apply(c)));
 	}
 
 	/**
@@ -196,8 +203,8 @@
 	 * @throws IdNotFound Pet was not found.
 	 */
 	public Pet update(UpdatePet u) throws IdNotFound {
-		EntityManager em = getEntityManager();
-		return merge(em, find(em, Pet.class, u.getId()).apply(u));
+		Pet pet =  petRepository.findById(u.getId()).get();		
+		return petRepository.save(pet.apply(u));
 	}
 
 	/**
@@ -208,8 +215,8 @@
 	 * @throws IdNotFound Order was not found.
 	 */
 	public Order update(Order o) throws IdNotFound {
-		EntityManager em = getEntityManager();
-		return merge(em, find(em, Order.class, o.getId()).apply(o));
+		Order order =  orderRepository.findById(o.getId()).get();		
+		return orderRepository.save(order.apply(o));
 	}
 
 	/**
@@ -221,9 +228,8 @@
 	 * @throws InvalidUsername The username was not valid.
 	 */
 	public User update(User u) throws IdNotFound, InvalidUsername {
-		assertValidUsername(u.getUsername());
-		EntityManager em = getEntityManager();
-		return merge(em, find(em, User.class, u.getUsername()).apply(u));
+		User user =  userRepository.findByUsername(u.getUsername());		
+		return userRepository.save(user.apply(u));
 	}
 
 	/**
@@ -233,8 +239,7 @@
 	 * @throws IdNotFound Pet was not found.
 	 */
 	public void removePet(long id) throws IdNotFound {
-		EntityManager em = getEntityManager();
-		remove(em, find(em, Pet.class, id));
+		petRepository.deleteById(id);
 	}
 
 	/**
@@ -244,8 +249,7 @@
 	 * @throws IdNotFound Order was not found.
 	 */
 	public void removeOrder(long id) throws IdNotFound {
-		EntityManager em = getEntityManager();
-		remove(em, find(em, Order.class, id));
+		orderRepository.deleteById(id);
 	}
 
 	/**
@@ -255,8 +259,7 @@
 	 * @throws IdNotFound User was not found.
 	 */
 	public void removeUser(String username) throws IdNotFound {
-		EntityManager em = getEntityManager();
-		remove(em, find(em, User.class, username));
+		userRepository.deleteByUsername(username);
 	}
 
 	/**
@@ -266,10 +269,7 @@
 	 * @return Pets with the specified statuses.
 	 */
 	public Collection<Pet> getPetsByStatus(PetStatus[] status) {
-		return getEntityManager()
-			.createQuery("select X from PetstorePet X where X.status in :status", Pet.class)
-			.setParameter("status", status)
-			.getResultList();
+		return petRepository.findByStatus(status);
 	}
 
 	/**
@@ -280,10 +280,7 @@
 	 * @throws InvalidTag Tag name was invalid.
 	 */
 	public Collection<Pet> getPetsByTags(String[] tags) throws InvalidTag {
-		return getEntityManager()
-			.createQuery("select X from PetstorePet X where X.tags in :tags", Pet.class)
-			.setParameter("tags", tags)
-			.getResultList();
+		return petRepository.findByTags(tags);
 	}
 
 	/**
diff --git a/juneau-petstore-server/src/main/resources/META-INF/persistence.xml b/juneau-petstore-server/src/main/resources/META-INF/persistence.xml
index 8db6a41..74ea1a9 100644
--- a/juneau-petstore-server/src/main/resources/META-INF/persistence.xml
+++ b/juneau-petstore-server/src/main/resources/META-INF/persistence.xml
@@ -26,7 +26,7 @@
 			<property name="javax.persistence.jdbc.user" value="" />
 			<property name="javax.persistence.jdbc.password" value="" />
 			<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" />
-			<property name="hibernate.hbm2ddl.auto" value="create-drop" />
+			<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
 			<property name="show_sql" value="true" />
 			<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
 		</properties>