diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java index f64b37fb533..92b21772917 100644 --- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java +++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java @@ -4333,6 +4333,13 @@ public void registerNewObjectForPersist(Object newObject, Map visitedObjects) { //if object is deleted and a create is issued on the that object // then the object must be transitioned back to existing and not deleted this.undeleteObject(newObject); + } else { + if (descriptor.getEventManager().hasAnyEventListeners()) { + DescriptorEvent event = new DescriptorEvent(newObject); + event.setEventCode(DescriptorEventManager.PreUpdateEvent); + event.setSession(this); + descriptor.getEventManager().executeEvent(event); + } } descriptor.getObjectBuilder().cascadeRegisterNewForCreate(newObject, this, visitedObjects); // After any cascade persists and assigning any sequence numbers, diff --git a/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/beanvalidation/BeanValidationJunitTest.java b/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/beanvalidation/BeanValidationJunitTest.java index 5c6741ddb7b..225ea56a98a 100644 --- a/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/beanvalidation/BeanValidationJunitTest.java +++ b/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/beanvalidation/BeanValidationJunitTest.java @@ -51,6 +51,7 @@ public static Test suite() { suite.addTest(new BeanValidationJunitTest("testRemoveWithInvalidData")); suite.addTest(new BeanValidationJunitTest("testTraversableResolverPreventsLoadingOfLazyRelationships")); suite.addTest(new BeanValidationJunitTest("testTraversableResolverPreventsTraversingRelationshipMultipleTimes")); + suite.addTest(new BeanValidationJunitTest("testPesistWithInvalidAndModifiedBeanData")); } return suite; } @@ -342,6 +343,32 @@ public void testTraversableResolverPreventsLoadingOfLazyRelationships() { assertTrue( "Lazy field should not be instantiated because of validation", !isInstantiated(employee, "projects", project) ); assertTrue( "Lazy field should not be instantiated because of validation", !isInstantiated(employee, "managedProject", project) ); } + + public void testPesistWithInvalidAndModifiedBeanData() { + + EntityManager em = createEntityManager(); + boolean gotConstraintViolations = false; + String invalidName = getFilledStringOfLength(Employee.NAME_MAX_SIZSE + 1); + String validName = getFilledStringOfLength(Employee.NAME_MAX_SIZSE - 1); + + // Persist an object with valid value + beginTransaction(em); + Employee e1 = new Employee(100, validName, validName, 1337); + em.persist(e1); + + // (b) now we demonstrate how eclipse link fails to invoke the JSR validations on entity + // when we modify the entity during the transaction with invalid value + try { + e1.setName(invalidName); + e1.setSurname(invalidName); + em.persist(e1); + }catch (ConstraintViolationException e) { + assertTrue("Transaction not marked for roll back when ConstraintViolation is thrown", getRollbackOnly(em)) ; + gotConstraintViolations =true; + } + assertTrue("Did not get Constraint Violation while persisting invalid data ", gotConstraintViolations); + } + /** * Strategy: