From ecaeb5e87165d650a390cefc177d860226353458 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 18 May 2013 16:21:36 +0300 Subject: [PATCH] persistence work --- spring-hibernate3/.classpath | 1 + spring-hibernate3/.project | 11 --- .../.settings/org.eclipse.jdt.core.prefs | 83 +++++++++++++++++++ .../org.eclipse.wst.common.component | 1 + spring-hibernate3/pom.xml | 14 ++++ .../persistence/dao/AbstractHibernateDao.java | 64 ++++++++++++++ .../spring/persistence/dao/FooDao.java | 5 +- .../spring/persistence/dao/IFooDao.java | 4 +- .../spring/persistence/dao/IOperations.java | 20 +++++ .../spring/persistence/model/Foo.java | 54 +++++++++++- .../persistence/service/FooService.java | 7 +- .../FooServicePersistenceIntegrationTest.java | 59 +++++++++++++ .../persistence/dao/AbstractHibernateDao.java | 17 ++-- .../spring/persistence/dao/IFooDao.java | 18 +--- .../spring/persistence/dao/IOperations.java | 20 +++++ 15 files changed, 341 insertions(+), 37 deletions(-) create mode 100644 spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/AbstractHibernateDao.java create mode 100644 spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/IOperations.java create mode 100644 spring-hibernate3/src/test/java/org/baeldung/spring/persistence/service/FooServicePersistenceIntegrationTest.java create mode 100644 spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/IOperations.java diff --git a/spring-hibernate3/.classpath b/spring-hibernate3/.classpath index 593395a46e..7e214d86c6 100644 --- a/spring-hibernate3/.classpath +++ b/spring-hibernate3/.classpath @@ -6,6 +6,7 @@ + diff --git a/spring-hibernate3/.project b/spring-hibernate3/.project index fba2188897..5725f008de 100644 --- a/spring-hibernate3/.project +++ b/spring-hibernate3/.project @@ -5,17 +5,6 @@ - - org.eclipse.ui.externaltools.ExternalToolBuilder - full,incremental, - - - LaunchConfigHandle - <project>/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch - - - - org.eclipse.jdt.core.javabuilder diff --git a/spring-hibernate3/.settings/org.eclipse.jdt.core.prefs b/spring-hibernate3/.settings/org.eclipse.jdt.core.prefs index 62492222ad..33f3a5c234 100644 --- a/spring-hibernate3/.settings/org.eclipse.jdt.core.prefs +++ b/spring-hibernate3/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,9 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve @@ -6,7 +11,85 @@ org.eclipse.jdt.core.compiler.compliance=1.7 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.7 diff --git a/spring-hibernate3/.settings/org.eclipse.wst.common.component b/spring-hibernate3/.settings/org.eclipse.wst.common.component index 14b1679703..2078f0abbb 100644 --- a/spring-hibernate3/.settings/org.eclipse.wst.common.component +++ b/spring-hibernate3/.settings/org.eclipse.wst.common.component @@ -4,6 +4,7 @@ + diff --git a/spring-hibernate3/pom.xml b/spring-hibernate3/pom.xml index 2fc47dbcad..69d9da3294 100644 --- a/spring-hibernate3/pom.xml +++ b/spring-hibernate3/pom.xml @@ -56,6 +56,20 @@ + + org.apache.commons + commons-lang3 + 3.1 + test + + + + org.springframework + spring-test + ${org.springframework.version} + test + + junit junit-dep diff --git a/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/AbstractHibernateDao.java b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/AbstractHibernateDao.java new file mode 100644 index 0000000000..0ff6307147 --- /dev/null +++ b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/AbstractHibernateDao.java @@ -0,0 +1,64 @@ +package org.baeldung.spring.persistence.dao; + +import java.io.Serializable; +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import com.google.common.base.Preconditions; + +@SuppressWarnings("unchecked") +public abstract class AbstractHibernateDao implements IOperations { + private Class clazz; + + @Autowired + private SessionFactory sessionFactory; + + // API + + protected final void setClazz(final Class clazzToSet) { + clazz = clazzToSet; + } + + @Override + public final T findOne(final long id) { + return ((T) getCurrentSession().get(clazz, id)); + } + + @Override + public final List findAll() { + return getCurrentSession().createQuery("from " + clazz.getName()).list(); + } + + @Override + public final long create(final T entity) { + Preconditions.checkNotNull(entity); + return (Long) getCurrentSession().save(entity); + } + + @Override + public final T update(final T entity) { + Preconditions.checkNotNull(entity); + return (T) getCurrentSession().merge(entity); + } + + @Override + public final void delete(final T entity) { + Preconditions.checkNotNull(entity); + getCurrentSession().delete(entity); + } + + @Override + public final void deleteById(final long entityId) { + final T entity = findOne(entityId); + Preconditions.checkState(entity != null); + delete(entity); + } + + protected final Session getCurrentSession() { + return sessionFactory.getCurrentSession(); + } + +} \ No newline at end of file diff --git a/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/FooDao.java b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/FooDao.java index a59bb30f48..1c76ed1f04 100644 --- a/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/FooDao.java +++ b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/FooDao.java @@ -1,12 +1,15 @@ package org.baeldung.spring.persistence.dao; +import org.baeldung.spring.persistence.model.Foo; import org.springframework.stereotype.Repository; @Repository -public class FooDao implements IFooDao { +public class FooDao extends AbstractHibernateDao implements IFooDao { public FooDao() { super(); + + setClazz(Foo.class); } // API diff --git a/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/IFooDao.java b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/IFooDao.java index 91d44f5f6b..eea1f17b5a 100644 --- a/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/IFooDao.java +++ b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/IFooDao.java @@ -1,5 +1,7 @@ package org.baeldung.spring.persistence.dao; -public interface IFooDao { +import org.baeldung.spring.persistence.model.Foo; + +public interface IFooDao extends IOperations { // } diff --git a/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/IOperations.java b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/IOperations.java new file mode 100644 index 0000000000..d2cb0a9cef --- /dev/null +++ b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/dao/IOperations.java @@ -0,0 +1,20 @@ +package org.baeldung.spring.persistence.dao; + +import java.io.Serializable; +import java.util.List; + +public interface IOperations { + + T findOne(final long id); + + List findAll(); + + long create(final T entity); + + T update(final T entity); + + void delete(final T entity); + + void deleteById(final long entityId); + +} diff --git a/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/model/Foo.java b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/model/Foo.java index 8842c26d95..2043d087e0 100644 --- a/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/model/Foo.java +++ b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/model/Foo.java @@ -1,21 +1,33 @@ package org.baeldung.spring.persistence.model; +import java.io.Serializable; + +import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity -public class Foo { +public class Foo implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; + @Column(nullable = false) + private String name; + public Foo() { super(); } + public Foo(final String name) { + super(); + + this.name = name; + } + // API public long getId() { @@ -26,6 +38,46 @@ public class Foo { this.id = id; } + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + // + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Foo other = (Foo) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Foo [name=").append(name).append("]"); + return builder.toString(); + } + } diff --git a/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/service/FooService.java b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/service/FooService.java index cda31a0e86..4983d99915 100644 --- a/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/service/FooService.java +++ b/spring-hibernate3/src/main/java/org/baeldung/spring/persistence/service/FooService.java @@ -1,6 +1,7 @@ package org.baeldung.spring.persistence.service; import org.baeldung.spring.persistence.dao.IFooDao; +import org.baeldung.spring.persistence.model.Foo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -8,7 +9,7 @@ import org.springframework.stereotype.Service; public class FooService { @Autowired - private IFooDao fooDao; + private IFooDao dao; public FooService() { super(); @@ -16,4 +17,8 @@ public class FooService { // API + public void create(final Foo entity) { + dao.create(entity); + } + } diff --git a/spring-hibernate3/src/test/java/org/baeldung/spring/persistence/service/FooServicePersistenceIntegrationTest.java b/spring-hibernate3/src/test/java/org/baeldung/spring/persistence/service/FooServicePersistenceIntegrationTest.java new file mode 100644 index 0000000000..576f536adc --- /dev/null +++ b/spring-hibernate3/src/test/java/org/baeldung/spring/persistence/service/FooServicePersistenceIntegrationTest.java @@ -0,0 +1,59 @@ +package org.baeldung.spring.persistence.service; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +import org.baeldung.spring.persistence.config.PersistenceConfig; +import org.baeldung.spring.persistence.model.Foo; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) +public class FooServicePersistenceIntegrationTest { + + @Autowired + private FooService service; + + // tests + + @Test + public final void whenContextIsBootstrapped_thenNoExceptions() { + // + } + + @Test + public final void whenEntityIsCreated_thenNoExceptions() { + service.create(new Foo(randomAlphabetic(6))); + } + + @Test(expected = DataIntegrityViolationException.class) + public final void whenInvalidEntityIsCreated_thenDataException() { + service.create(new Foo()); + } + + @Test(expected = DataIntegrityViolationException.class) + public final void whenEntityWithLongNameIsCreated_thenDataException() { + service.create(new Foo(randomAlphabetic(2048))); + } + + @Test(expected = InvalidDataAccessApiUsageException.class) + public final void whenSameEntityIsCreatedTwice_thenDataException() { + final Foo entity = new Foo(randomAlphabetic(8)); + service.create(entity); + service.create(entity); + } + + @Test + @Ignore + public final void temp_whenInvalidEntityIsCreated_thenDataException() { + service.create(new Foo(randomAlphabetic(2048))); + } + +} diff --git a/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/AbstractHibernateDao.java b/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/AbstractHibernateDao.java index 4ff95f1126..0ff6307147 100644 --- a/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/AbstractHibernateDao.java +++ b/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/AbstractHibernateDao.java @@ -10,7 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.google.common.base.Preconditions; @SuppressWarnings("unchecked") -public abstract class AbstractHibernateDao { +public abstract class AbstractHibernateDao implements IOperations { private Class clazz; @Autowired @@ -22,31 +22,36 @@ public abstract class AbstractHibernateDao { clazz = clazzToSet; } - public final T findOne(final Long id) { - Preconditions.checkArgument(id != null); + @Override + public final T findOne(final long id) { return ((T) getCurrentSession().get(clazz, id)); } + @Override public final List findAll() { return getCurrentSession().createQuery("from " + clazz.getName()).list(); } - public final void create(final T entity) { + @Override + public final long create(final T entity) { Preconditions.checkNotNull(entity); - getCurrentSession().persist(entity); + return (Long) getCurrentSession().save(entity); } + @Override public final T update(final T entity) { Preconditions.checkNotNull(entity); return (T) getCurrentSession().merge(entity); } + @Override public final void delete(final T entity) { Preconditions.checkNotNull(entity); getCurrentSession().delete(entity); } - public final void deleteById(final Long entityId) { + @Override + public final void deleteById(final long entityId) { final T entity = findOne(entityId); Preconditions.checkState(entity != null); delete(entity); diff --git a/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/IFooDao.java b/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/IFooDao.java index 6ad12b147c..eea1f17b5a 100644 --- a/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/IFooDao.java +++ b/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/IFooDao.java @@ -1,21 +1,7 @@ package org.baeldung.spring.persistence.dao; -import java.util.List; - import org.baeldung.spring.persistence.model.Foo; -public interface IFooDao { - - Foo findOne(final Long id); - - List findAll(); - - void create(final Foo entity); - - Foo update(final Foo entity); - - void delete(final Foo entity); - - void deleteById(final Long entityId); - +public interface IFooDao extends IOperations { + // } diff --git a/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/IOperations.java b/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/IOperations.java new file mode 100644 index 0000000000..d2cb0a9cef --- /dev/null +++ b/spring-hibernate4/src/main/java/org/baeldung/spring/persistence/dao/IOperations.java @@ -0,0 +1,20 @@ +package org.baeldung.spring.persistence.dao; + +import java.io.Serializable; +import java.util.List; + +public interface IOperations { + + T findOne(final long id); + + List findAll(); + + long create(final T entity); + + T update(final T entity); + + void delete(final T entity); + + void deleteById(final long entityId); + +}