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>