diff --git a/pom.xml b/pom.xml index 7f125cd00..049ecd71c 100644 --- a/pom.xml +++ b/pom.xml @@ -148,6 +148,10 @@ org.hibernate hibernate-entitymanager + + org.hibernate + hibernate-ehcache + org.hibernate hibernate-validator diff --git a/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java b/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/springframework/samples/petclinic/model/Owner.java b/src/main/java/org/springframework/samples/petclinic/model/Owner.java old mode 100644 new mode 100755 index c0efd4670..1db9983bf --- a/src/main/java/org/springframework/samples/petclinic/model/Owner.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Owner.java @@ -15,6 +15,7 @@ */ package org.springframework.samples.petclinic.model; +import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.validator.constraints.NotEmpty; import org.springframework.beans.support.MutableSortDefinition; import org.springframework.beans.support.PropertyComparator; @@ -34,6 +35,7 @@ import java.util.*; */ @Entity @Table(name = "owners") +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class Owner extends Person { @Column(name = "address") @NotEmpty @@ -48,7 +50,8 @@ public class Owner extends Person { @Digits(fraction = 0, integer = 10) private String telephone; - @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner") + @OneToMany(mappedBy = "owner") + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) private Set pets; diff --git a/src/main/java/org/springframework/samples/petclinic/model/Pet.java b/src/main/java/org/springframework/samples/petclinic/model/Pet.java old mode 100644 new mode 100755 index 0fb907ce7..645e09c0b --- a/src/main/java/org/springframework/samples/petclinic/model/Pet.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Pet.java @@ -15,6 +15,7 @@ */ package org.springframework.samples.petclinic.model; +import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Type; import org.joda.time.DateTime; import org.springframework.beans.support.MutableSortDefinition; @@ -33,6 +34,7 @@ import java.util.*; */ @Entity @Table(name = "pets") +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class Pet extends NamedEntity { @Column(name = "birth_date") @@ -48,7 +50,8 @@ public class Pet extends NamedEntity { @JoinColumn(name = "owner_id") private Owner owner; - @OneToMany(cascade = CascadeType.ALL, mappedBy = "pet") + @OneToMany(mappedBy = "pet") + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) private Set visits; diff --git a/src/main/java/org/springframework/samples/petclinic/model/PetType.java b/src/main/java/org/springframework/samples/petclinic/model/PetType.java old mode 100644 new mode 100755 index 50cf0399a..b1a271e76 --- a/src/main/java/org/springframework/samples/petclinic/model/PetType.java +++ b/src/main/java/org/springframework/samples/petclinic/model/PetType.java @@ -15,6 +15,9 @@ */ package org.springframework.samples.petclinic.model; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import javax.persistence.Cacheable; import javax.persistence.Entity; import javax.persistence.Table; @@ -23,6 +26,7 @@ import javax.persistence.Table; */ @Entity @Table(name = "types") +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY) public class PetType extends NamedEntity { } diff --git a/src/main/java/org/springframework/samples/petclinic/model/Visit.java b/src/main/java/org/springframework/samples/petclinic/model/Visit.java old mode 100644 new mode 100755 index 9ea0897f8..9d55e57d1 --- a/src/main/java/org/springframework/samples/petclinic/model/Visit.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Visit.java @@ -15,6 +15,7 @@ */ package org.springframework.samples.petclinic.model; +import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Type; import org.hibernate.validator.constraints.NotEmpty; import org.joda.time.DateTime; @@ -29,6 +30,7 @@ import javax.persistence.*; */ @Entity @Table(name = "visits") +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class Visit extends BaseEntity { /** diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java old mode 100644 new mode 100755 index acebc6366..03c5c16c8 --- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java @@ -23,6 +23,7 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import java.util.Collection; +import org.springframework.cache.annotation.Cacheable; /** * JPA implementation of the {@link OwnerRepository} interface. @@ -42,6 +43,7 @@ public class JpaOwnerRepositoryImpl implements OwnerRepository { @Override @SuppressWarnings("unchecked") + @Cacheable(value = "ownersByLastName") public Collection findByLastName(String lastName) { // using 'join fetch' because a single query should load both owners and pets // using 'left join fetch' because it might happen that an owner does not have pets yet @@ -52,18 +54,13 @@ public class JpaOwnerRepositoryImpl implements OwnerRepository { @Override public Owner findById(int id) { - // using 'join fetch' because a single query should load both owners and pets - // using 'left join fetch' because it might happen that an owner does not have pets yet - Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id"); - query.setParameter("id", id); - return (Owner) query.getSingleResult(); + return em.find(Owner.class, id); } @Override public void save(Owner owner) { - this.em.merge(owner); - + em.merge(owner); } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java old mode 100644 new mode 100755 index 4073c9d86..336e5416d --- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java @@ -19,6 +19,7 @@ import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.PetType; import org.springframework.samples.petclinic.repository.PetRepository; import org.springframework.stereotype.Repository; +import org.springframework.cache.annotation.Cacheable; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @@ -41,6 +42,7 @@ public class JpaPetRepositoryImpl implements PetRepository { @Override @SuppressWarnings("unchecked") + @Cacheable(value = "pettype") public List findPetTypes() { return this.em.createQuery("SELECT ptype FROM PetType ptype ORDER BY ptype.name").getResultList(); } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java old mode 100644 new mode 100755 index e9fbf07a8..a83f5fd92 --- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java @@ -15,6 +15,7 @@ */ package org.springframework.samples.petclinic.repository.jpa; +import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.Visit; import org.springframework.samples.petclinic.repository.VisitRepository; import org.springframework.stereotype.Repository; @@ -51,9 +52,8 @@ public class JpaVisitRepositoryImpl implements VisitRepository { @Override @SuppressWarnings("unchecked") public List findByPetId(Integer petId) { - Query query = this.em.createQuery("SELECT visit FROM Visit v where v.pets.id= :id"); - query.setParameter("id", petId); - return query.getResultList(); + Pet pet = em.find(Pet.class, petId); + return pet.getVisits(); } } diff --git a/src/main/java/org/springframework/samples/petclinic/web/VisitController.java b/src/main/java/org/springframework/samples/petclinic/web/VisitController.java index d2d6d9448..9b5f63a74 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/VisitController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/VisitController.java @@ -63,6 +63,7 @@ public class VisitController { public String processNewVisitForm(@PathVariable("petId") int petId, @Valid Visit visit, BindingResult result) { Pet pet = this.clinicService.findPetById(petId); visit.setPet(pet); + pet.addVisit(visit); if (result.hasErrors()) { return "pets/createOrUpdateVisitForm"; } else { diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml old mode 100644 new mode 100755 index 32e509953..1b044a032 --- a/src/main/resources/ehcache.xml +++ b/src/main/resources/ehcache.xml @@ -13,5 +13,37 @@ diskPersistent="false" diskExpiryThreadIntervalSeconds="1" memoryStoreEvictionPolicy="LRU"/> + + + + + + + + + + + + + + + + diff --git a/src/main/resources/spring/business-config.xml b/src/main/resources/spring/business-config.xml index 9ea5c1764..a0b65f9de 100644 --- a/src/main/resources/spring/business-config.xml +++ b/src/main/resources/spring/business-config.xml @@ -58,6 +58,13 @@ + + + org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory + true + false + + diff --git a/src/main/resources/spring/tools-config.xml b/src/main/resources/spring/tools-config.xml index 033703b75..12eca1077 100644 --- a/src/main/resources/spring/tools-config.xml +++ b/src/main/resources/spring/tools-config.xml @@ -43,6 +43,7 @@ +