diff --git a/spring-exceptions/src/main/java/org/baeldung/ex/dataIntegrityviolationexception/spring/Cause1DataContextWithJavaConfig.java b/spring-exceptions/src/main/java/org/baeldung/ex/dataIntegrityviolationexception/spring/Cause1DataContextWithJavaConfig.java new file mode 100644 index 0000000000..b1dabd7ec3 --- /dev/null +++ b/spring-exceptions/src/main/java/org/baeldung/ex/dataIntegrityviolationexception/spring/Cause1DataContextWithJavaConfig.java @@ -0,0 +1,23 @@ +package org.baeldung.ex.dataIntegrityviolationexception.spring; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; + +@Configuration +@ComponentScan("org.baeldung.ex.dataIntegrityviolationexception.cause1") +public class Cause1DataContextWithJavaConfig { + + public Cause1DataContextWithJavaConfig() { + super(); + } + + // beans + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { + return new PersistenceExceptionTranslationPostProcessor(); + } + +} \ No newline at end of file diff --git a/spring-exceptions/src/main/java/org/baeldung/ex/dataIntegrityviolationexception/spring/Cause2DataContextWithJavaConfig.java b/spring-exceptions/src/main/java/org/baeldung/ex/dataIntegrityviolationexception/spring/Cause2DataContextWithJavaConfig.java new file mode 100644 index 0000000000..e0e54e5abc --- /dev/null +++ b/spring-exceptions/src/main/java/org/baeldung/ex/dataIntegrityviolationexception/spring/Cause2DataContextWithJavaConfig.java @@ -0,0 +1,16 @@ +package org.baeldung.ex.dataIntegrityviolationexception.spring; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("org.baeldung.ex.dataIntegrityviolationexception.cause2") +public class Cause2DataContextWithJavaConfig { + + public Cause2DataContextWithJavaConfig() { + super(); + } + + // beans + +} \ No newline at end of file diff --git a/spring-exceptions/src/main/java/org/baeldung/ex/dataIntegrityviolationexception/spring/Cause3DataContextWithJavaConfig.java b/spring-exceptions/src/main/java/org/baeldung/ex/dataIntegrityviolationexception/spring/Cause3DataContextWithJavaConfig.java new file mode 100644 index 0000000000..3eb8df39be --- /dev/null +++ b/spring-exceptions/src/main/java/org/baeldung/ex/dataIntegrityviolationexception/spring/Cause3DataContextWithJavaConfig.java @@ -0,0 +1,16 @@ +package org.baeldung.ex.dataIntegrityviolationexception.spring; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("org.baeldung.ex.dataIntegrityviolationexception.cause3") +public class Cause3DataContextWithJavaConfig { + + public Cause3DataContextWithJavaConfig() { + super(); + } + + // beans + +} \ No newline at end of file diff --git a/spring-exceptions/src/test/java/org/baeldung/ex/dataIntegrityviolationexception/Cause1DataIntegrityViolationExceptionIntegrationTest.java b/spring-exceptions/src/test/java/org/baeldung/ex/dataIntegrityviolationexception/Cause1DataIntegrityViolationExceptionIntegrationTest.java new file mode 100644 index 0000000000..8b503e989a --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/ex/dataIntegrityviolationexception/Cause1DataIntegrityViolationExceptionIntegrationTest.java @@ -0,0 +1,19 @@ +package org.baeldung.ex.dataIntegrityviolationexception; + +import org.baeldung.ex.dataIntegrityviolationexception.spring.Cause1DataContextWithJavaConfig; +import org.junit.Test; +import org.junit.runner.RunWith; +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 = { Cause1DataContextWithJavaConfig.class }, loader = AnnotationConfigContextLoader.class) +public class Cause1DataIntegrityViolationExceptionIntegrationTest { + + @Test + public final void givenContextIsInitialized_thenNoException() { + // + } + +} diff --git a/spring-exceptions/src/test/java/org/baeldung/ex/dataIntegrityviolationexception/Cause2DataIntegrityViolationExceptionIntegrationTest.java b/spring-exceptions/src/test/java/org/baeldung/ex/dataIntegrityviolationexception/Cause2DataIntegrityViolationExceptionIntegrationTest.java new file mode 100644 index 0000000000..2eec55736d --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/ex/dataIntegrityviolationexception/Cause2DataIntegrityViolationExceptionIntegrationTest.java @@ -0,0 +1,19 @@ +package org.baeldung.ex.dataIntegrityviolationexception; + +import org.baeldung.ex.dataIntegrityviolationexception.spring.Cause2DataContextWithJavaConfig; +import org.junit.Test; +import org.junit.runner.RunWith; +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 = { Cause2DataContextWithJavaConfig.class }, loader = AnnotationConfigContextLoader.class) +public class Cause2DataIntegrityViolationExceptionIntegrationTest { + + @Test + public final void givenContextIsInitialized_thenNoException() { + // + } + +} diff --git a/spring-exceptions/src/test/java/org/baeldung/ex/dataIntegrityviolationexception/Cause3DataIntegrityViolationExceptionIntegrationTest.java b/spring-exceptions/src/test/java/org/baeldung/ex/dataIntegrityviolationexception/Cause3DataIntegrityViolationExceptionIntegrationTest.java new file mode 100644 index 0000000000..5f4cf59f3a --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/ex/dataIntegrityviolationexception/Cause3DataIntegrityViolationExceptionIntegrationTest.java @@ -0,0 +1,19 @@ +package org.baeldung.ex.dataIntegrityviolationexception; + +import org.baeldung.ex.dataIntegrityviolationexception.spring.Cause3DataContextWithJavaConfig; +import org.junit.Test; +import org.junit.runner.RunWith; +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 = { Cause3DataContextWithJavaConfig.class }, loader = AnnotationConfigContextLoader.class) +public class Cause3DataIntegrityViolationExceptionIntegrationTest { + + @Test + public final void givenContextIsInitialized_thenNoException() { + // + } + +} diff --git a/spring-exceptions/src/test/java/org/baeldung/ex/nosuchbeandefinitionexception/Cause1NoSuchBeanDefinitionExceptionIntegrationTest.java b/spring-exceptions/src/test/java/org/baeldung/ex/nosuchbeandefinitionexception/Cause1NoSuchBeanDefinitionExceptionIntegrationTest.java index aed37a125a..6f42b75398 100644 --- a/spring-exceptions/src/test/java/org/baeldung/ex/nosuchbeandefinitionexception/Cause1NoSuchBeanDefinitionExceptionIntegrationTest.java +++ b/spring-exceptions/src/test/java/org/baeldung/ex/nosuchbeandefinitionexception/Cause1NoSuchBeanDefinitionExceptionIntegrationTest.java @@ -1,8 +1,14 @@ package org.baeldung.ex.nosuchbeandefinitionexception; import org.baeldung.ex.nosuchbeandefinitionexception.spring.Cause1ContextWithJavaConfig; +import org.baeldung.persistence.model.Child; +import org.baeldung.persistence.model.Parent; +import org.baeldung.persistence.service.IChildService; +import org.baeldung.persistence.service.IParentService; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; @@ -11,9 +17,23 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; @ContextConfiguration(classes = { Cause1ContextWithJavaConfig.class }, loader = AnnotationConfigContextLoader.class) public class Cause1NoSuchBeanDefinitionExceptionIntegrationTest { - @Test - public final void givenContextIsInitialized_thenNoException() { - // + @Autowired + private IParentService service; + + @Autowired + private IChildService childService; + + // tests + + @Test(expected = DataIntegrityViolationException.class) + public void whenChildIsDeletedWhileParentStillHasForeignKeyToIt_thenDataException() { + final Child childEntity = new Child(); + childService.create(childEntity); + + final Parent parentEntity = new Parent(childEntity); + service.create(parentEntity); + + childService.delete(childEntity); } } diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/IChildDao.java b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/IChildDao.java new file mode 100644 index 0000000000..3bc0dc1fc4 --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/IChildDao.java @@ -0,0 +1,8 @@ +package org.baeldung.persistence.dao; + +import org.baeldung.persistence.dao.common.IOperations; +import org.baeldung.persistence.model.Child; + +public interface IChildDao extends IOperations { + // +} diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/IParentDao.java b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/IParentDao.java new file mode 100644 index 0000000000..09158a4143 --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/IParentDao.java @@ -0,0 +1,8 @@ +package org.baeldung.persistence.dao; + +import org.baeldung.persistence.dao.common.IOperations; +import org.baeldung.persistence.model.Parent; + +public interface IParentDao extends IOperations { + // +} diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/AbstractHibernateDao.java b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/AbstractHibernateDao.java new file mode 100644 index 0000000000..65e57afcb3 --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/AbstractHibernateDao.java @@ -0,0 +1,65 @@ +package org.baeldung.persistence.dao.common; + +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 = Preconditions.checkNotNull(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 void create(final T entity) { + Preconditions.checkNotNull(entity); + // getCurrentSession().persist(entity); + getCurrentSession().saveOrUpdate(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-exceptions/src/test/java/org/baeldung/persistence/dao/common/IOperations.java b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/IOperations.java new file mode 100644 index 0000000000..1c84b06c85 --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/IOperations.java @@ -0,0 +1,20 @@ +package org.baeldung.persistence.dao.common; + +import java.io.Serializable; +import java.util.List; + +public interface IOperations { + + T findOne(final long id); + + List findAll(); + + void create(final T entity); + + T update(final T entity); + + void delete(final T entity); + + void deleteById(final long entityId); + +} diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ChildDao.java b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ChildDao.java new file mode 100644 index 0000000000..d9c8fdceec --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ChildDao.java @@ -0,0 +1,24 @@ +package org.baeldung.persistence.dao.impl; + +import org.baeldung.persistence.dao.IChildDao; +import org.baeldung.persistence.dao.common.AbstractHibernateDao; +import org.baeldung.persistence.model.Child; +import org.hibernate.SessionFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +@Repository +public class ChildDao extends AbstractHibernateDao implements IChildDao { + + @Autowired + private SessionFactory sessionFactory; + + public ChildDao() { + super(); + + setClazz(Child.class); + } + + // API + +} diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ParentDao.java b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ParentDao.java new file mode 100644 index 0000000000..003ec62741 --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ParentDao.java @@ -0,0 +1,24 @@ +package org.baeldung.persistence.dao.impl; + +import org.baeldung.persistence.dao.IParentDao; +import org.baeldung.persistence.dao.common.AbstractHibernateDao; +import org.baeldung.persistence.model.Parent; +import org.hibernate.SessionFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +@Repository +public class ParentDao extends AbstractHibernateDao implements IParentDao { + + @Autowired + private SessionFactory sessionFactory; + + public ParentDao() { + super(); + + setClazz(Parent.class); + } + + // API + +} diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/model/Child.java b/spring-exceptions/src/test/java/org/baeldung/persistence/model/Child.java new file mode 100644 index 0000000000..4eec4cf1d3 --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/persistence/model/Child.java @@ -0,0 +1,51 @@ +package org.baeldung.persistence.model; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToOne; + +@Entity +public class Child implements Serializable { + + @Id + @GeneratedValue + private long id; + + @OneToOne(mappedBy = "child") + private Parent parent; + + public Child() { + super(); + } + + // API + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public Parent getParent() { + return parent; + } + + public void setParent(final Parent parent) { + this.parent = parent; + } + + // + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Child [id=").append(id).append("]"); + return builder.toString(); + } + +} diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/model/Parent.java b/spring-exceptions/src/test/java/org/baeldung/persistence/model/Parent.java new file mode 100644 index 0000000000..19e405615d --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/persistence/model/Parent.java @@ -0,0 +1,60 @@ +package org.baeldung.persistence.model; + +import java.io.Serializable; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToOne; + +@Entity +public class Parent implements Serializable { + + @Id + @GeneratedValue + private long id; + + @OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH }) + @JoinColumn(name = "child_fk") + private Child child; + + public Parent() { + super(); + } + + public Parent(final Child child) { + super(); + + this.child = child; + } + + // API + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public Child getChild() { + return child; + } + + public void setChild(final Child child) { + this.child = child; + } + + // + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Parent [id=").append(id).append("]"); + return builder.toString(); + } + +} diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/service/IChildService.java b/spring-exceptions/src/test/java/org/baeldung/persistence/service/IChildService.java new file mode 100644 index 0000000000..c6c5e2cfb1 --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/persistence/service/IChildService.java @@ -0,0 +1,8 @@ +package org.baeldung.persistence.service; + +import org.baeldung.persistence.dao.common.IOperations; +import org.baeldung.persistence.model.Child; + +public interface IChildService extends IOperations { + // +} diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/service/IParentService.java b/spring-exceptions/src/test/java/org/baeldung/persistence/service/IParentService.java new file mode 100644 index 0000000000..1782c281d2 --- /dev/null +++ b/spring-exceptions/src/test/java/org/baeldung/persistence/service/IParentService.java @@ -0,0 +1,8 @@ +package org.baeldung.persistence.service; + +import org.baeldung.persistence.dao.common.IOperations; +import org.baeldung.persistence.model.Parent; + +public interface IParentService extends IOperations { + // +}