Migrate tests from org.hibernate.jpa.test to org.hibernate.orm.test.jpa
Signed-off-by: Jan Schatteman <jschatte@redhat.com>
This commit is contained in:
parent
e3a36974a8
commit
f9937f66be
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.query.sql.internal;
|
package org.hibernate.query.sql.internal;
|
||||||
|
|
||||||
|
import org.hibernate.NotYetImplementedFor6Exception;
|
||||||
import org.hibernate.cfg.NotYetImplementedException;
|
import org.hibernate.cfg.NotYetImplementedException;
|
||||||
import org.hibernate.query.spi.NonSelectQueryPlan;
|
import org.hibernate.query.spi.NonSelectQueryPlan;
|
||||||
import org.hibernate.query.sql.spi.NativeQueryImplementor;
|
import org.hibernate.query.sql.spi.NativeQueryImplementor;
|
||||||
|
@ -23,6 +24,6 @@ public class NativeNonSelectQueryPlanImpl implements NonSelectQueryPlan {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int executeUpdate(ExecutionContext executionContext) {
|
public int executeUpdate(ExecutionContext executionContext) {
|
||||||
throw new NotYetImplementedException();
|
throw new NotYetImplementedFor6Exception();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,102 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.beanvalidation;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.util.Map;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.RollbackException;
|
|
||||||
import javax.validation.ConstraintViolationException;
|
|
||||||
|
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
|
||||||
import org.hibernate.cfg.beanvalidation.ValidationMode;
|
|
||||||
import org.hibernate.dialect.H2Dialect;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.RequiresDialect;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class BeanValidationTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void addMappings(Map settings) {
|
|
||||||
settings.put(
|
|
||||||
AvailableSettings.JPA_VALIDATION_MODE,
|
|
||||||
ValidationMode.AUTO
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testBeanValidationIntegrationOnFlush() {
|
|
||||||
CupHolder ch = new CupHolder();
|
|
||||||
ch.setRadius( new BigDecimal( "12" ) );
|
|
||||||
ch.setTitle( "foo" );
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
try {
|
|
||||||
em.persist( ch );
|
|
||||||
em.flush();
|
|
||||||
fail( "invalid object should not be persisted" );
|
|
||||||
}
|
|
||||||
catch ( ConstraintViolationException e ) {
|
|
||||||
assertEquals( 1, e.getConstraintViolations().size() );
|
|
||||||
}
|
|
||||||
assertTrue(
|
|
||||||
"A constraint violation exception should mark the transaction for rollback",
|
|
||||||
em.getTransaction().getRollbackOnly()
|
|
||||||
);
|
|
||||||
em.getTransaction().rollback();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testBeanValidationIntegrationOnCommit() {
|
|
||||||
CupHolder ch = new CupHolder();
|
|
||||||
ch.setRadius( new BigDecimal( "9" ) );
|
|
||||||
ch.setTitle( "foo" );
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( ch );
|
|
||||||
em.flush();
|
|
||||||
try {
|
|
||||||
ch.setRadius( new BigDecimal( "12" ) );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
fail( "invalid object should not be persisted" );
|
|
||||||
}
|
|
||||||
catch ( RollbackException e ) {
|
|
||||||
final Throwable cve = e.getCause();
|
|
||||||
assertTrue( cve instanceof ConstraintViolationException );
|
|
||||||
assertEquals( 1, ( (ConstraintViolationException) cve ).getConstraintViolations().size() );
|
|
||||||
}
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@RequiresDialect(H2Dialect.class)
|
|
||||||
public void testTitleColumnHasExpectedLength() {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
int len = (Integer) em.createNativeQuery(
|
|
||||||
"select CHARACTER_MAXIMUM_LENGTH from INFORMATION_SCHEMA.COLUMNS c where c.TABLE_NAME = 'CUPHOLDER' and c.COLUMN_NAME = 'TITLE'"
|
|
||||||
).getSingleResult();
|
|
||||||
assertEquals( 64, len );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[] {
|
|
||||||
CupHolder.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cacheable.api;
|
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.SharedCacheMode;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.testing.cache.CachingRegionFactory;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Steve Ebersole
|
|
||||||
*/
|
|
||||||
public class JpaCacheApiUsageTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Override
|
|
||||||
protected Class<?>[] getAnnotatedClasses() {
|
|
||||||
return new Class[] { Order.class };
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
protected void addConfigOptions(Map options) {
|
|
||||||
// options.put( AvailableSettings.USE_SECOND_LEVEL_CACHE, "true" );
|
|
||||||
options.put( AvailableSettings.CACHE_REGION_FACTORY, CachingRegionFactory.class.getName() );
|
|
||||||
// options.put( AvailableSettings.DEFAULT_CACHE_CONCURRENCY_STRATEGY, "read-write" );
|
|
||||||
options.put( org.hibernate.jpa.AvailableSettings.SHARED_CACHE_MODE, SharedCacheMode.ALL );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEviction() {
|
|
||||||
// first create an Order
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( new Order( 1, 500 ) );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
assertTrue( entityManagerFactory().getCache().contains( Order.class, 1 ) );
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
assertTrue( entityManagerFactory().getCache().contains( Order.class, 1 ) );
|
|
||||||
em.createQuery( "delete Order" ).executeUpdate();
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
assertFalse( entityManagerFactory().getCache().contains( Order.class, 1 ) );
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,101 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cacheable.cachemodes;
|
|
||||||
|
|
||||||
import javax.persistence.CacheRetrieveMode;
|
|
||||||
import javax.persistence.CacheStoreMode;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
|
|
||||||
import org.hibernate.CacheMode;
|
|
||||||
import org.hibernate.Session;
|
|
||||||
import org.hibernate.jpa.AvailableSettings;
|
|
||||||
import org.hibernate.jpa.HibernateEntityManager;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Steve Ebersole
|
|
||||||
*/
|
|
||||||
public class SharedCacheModesTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[] { SimpleEntity.class };
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEntityManagerCacheModes() {
|
|
||||||
|
|
||||||
EntityManager em;
|
|
||||||
Session session;
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
session = em.unwrap( Session.class );
|
|
||||||
|
|
||||||
// defaults...
|
|
||||||
assertEquals( CacheStoreMode.USE, em.getProperties().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheRetrieveMode.USE, em.getProperties().get( AvailableSettings.SHARED_CACHE_RETRIEVE_MODE ) );
|
|
||||||
assertEquals( CacheMode.NORMAL, session.getCacheMode() );
|
|
||||||
|
|
||||||
// overrides...
|
|
||||||
em.setProperty( AvailableSettings.SHARED_CACHE_STORE_MODE, CacheStoreMode.REFRESH );
|
|
||||||
assertEquals( CacheStoreMode.REFRESH, em.getProperties().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheMode.REFRESH, session.getCacheMode() );
|
|
||||||
|
|
||||||
em.setProperty( AvailableSettings.SHARED_CACHE_STORE_MODE, CacheStoreMode.BYPASS );
|
|
||||||
assertEquals( CacheStoreMode.BYPASS, em.getProperties().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheMode.GET, session.getCacheMode() );
|
|
||||||
|
|
||||||
em.setProperty( AvailableSettings.SHARED_CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS );
|
|
||||||
assertEquals( CacheRetrieveMode.BYPASS, em.getProperties().get( AvailableSettings.SHARED_CACHE_RETRIEVE_MODE ) );
|
|
||||||
assertEquals( CacheMode.IGNORE, session.getCacheMode() );
|
|
||||||
|
|
||||||
em.setProperty( AvailableSettings.SHARED_CACHE_STORE_MODE, CacheStoreMode.USE );
|
|
||||||
assertEquals( CacheStoreMode.USE, em.getProperties().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheMode.PUT, session.getCacheMode() );
|
|
||||||
|
|
||||||
em.setProperty( AvailableSettings.SHARED_CACHE_STORE_MODE, CacheStoreMode.REFRESH );
|
|
||||||
assertEquals( CacheStoreMode.REFRESH, em.getProperties().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheMode.REFRESH, session.getCacheMode() );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testQueryCacheModes() {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
org.hibernate.query.Query query = em.createQuery( "from SimpleEntity" ).unwrap( org.hibernate.query.Query.class );
|
|
||||||
|
|
||||||
query.setHint( AvailableSettings.SHARED_CACHE_STORE_MODE, CacheStoreMode.USE );
|
|
||||||
assertEquals( CacheStoreMode.USE, query.getHints().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheMode.NORMAL, query.getCacheMode() );
|
|
||||||
|
|
||||||
query.setHint( AvailableSettings.SHARED_CACHE_STORE_MODE, CacheStoreMode.BYPASS );
|
|
||||||
assertEquals( CacheStoreMode.BYPASS, query.getHints().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheMode.GET, query.getCacheMode() );
|
|
||||||
|
|
||||||
query.setHint( AvailableSettings.SHARED_CACHE_STORE_MODE, CacheStoreMode.REFRESH );
|
|
||||||
assertEquals( CacheStoreMode.REFRESH, query.getHints().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheMode.REFRESH, query.getCacheMode() );
|
|
||||||
|
|
||||||
query.setHint( AvailableSettings.SHARED_CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS );
|
|
||||||
assertEquals( CacheRetrieveMode.BYPASS, query.getHints().get( AvailableSettings.SHARED_CACHE_RETRIEVE_MODE ) );
|
|
||||||
assertEquals( CacheStoreMode.REFRESH, query.getHints().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheMode.REFRESH, query.getCacheMode() );
|
|
||||||
|
|
||||||
query.setHint( AvailableSettings.SHARED_CACHE_STORE_MODE, CacheStoreMode.BYPASS );
|
|
||||||
assertEquals( CacheRetrieveMode.BYPASS, query.getHints().get( AvailableSettings.SHARED_CACHE_RETRIEVE_MODE ) );
|
|
||||||
assertEquals( CacheStoreMode.BYPASS, query.getHints().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheMode.IGNORE, query.getCacheMode() );
|
|
||||||
|
|
||||||
query.setHint( AvailableSettings.SHARED_CACHE_STORE_MODE, CacheStoreMode.USE );
|
|
||||||
assertEquals( CacheRetrieveMode.BYPASS, query.getHints().get( AvailableSettings.SHARED_CACHE_RETRIEVE_MODE ) );
|
|
||||||
assertEquals( CacheStoreMode.USE, query.getHints().get( AvailableSettings.SHARED_CACHE_STORE_MODE ) );
|
|
||||||
assertEquals( CacheMode.PUT, query.getCacheMode() );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,65 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.callbacks;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Map;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
|
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
import org.hibernate.jpa.test.Cat;
|
|
||||||
import org.hibernate.jpa.test.Kitten;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Sanne Grinovero
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public class CallbacksDisabledTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCallbacksAreDisabled() throws Exception {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
Cat c = new Cat();
|
|
||||||
c.setName( "Kitty" );
|
|
||||||
c.setDateOfBirth( new Date( 90, 11, 15 ) );
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( c );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.clear();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
c = em.find( Cat.class, c.getId() );
|
|
||||||
assertTrue( c.getAge() == 0 ); // With listeners enabled this would be false. Proven by org.hibernate.jpa.test.callbacks.CallbacksTest.testCallbackMethod
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[]{
|
|
||||||
Cat.class,
|
|
||||||
Translation.class,
|
|
||||||
Television.class,
|
|
||||||
RemoteControl.class,
|
|
||||||
Rythm.class,
|
|
||||||
Plant.class,
|
|
||||||
Kitten.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void addConfigOptions(Map options) {
|
|
||||||
options.put( AvailableSettings.JPA_CALLBACKS_ENABLED, "false" );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,257 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.callbacks;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
import org.hibernate.jpa.test.Cat;
|
|
||||||
import org.hibernate.jpa.test.Kitten;
|
|
||||||
|
|
||||||
import org.hibernate.testing.FailureExpected;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public class CallbacksTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Test
|
|
||||||
public void testCallbackMethod() throws Exception {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
Cat c = new Cat();
|
|
||||||
c.setName( "Kitty" );
|
|
||||||
c.setDateOfBirth( new Date( 90, 11, 15 ) );
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( c );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.clear();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
c = em.find( Cat.class, c.getId() );
|
|
||||||
assertFalse( c.getAge() == 0 );
|
|
||||||
c.setName( "Tomcat" ); //update this entity
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.clear();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
c = em.find( Cat.class, c.getId() );
|
|
||||||
assertEquals( "Tomcat", c.getName() );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEntityListener() throws Exception {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
Cat c = new Cat();
|
|
||||||
c.setName( "Kitty" );
|
|
||||||
c.setLength( 12 );
|
|
||||||
c.setDateOfBirth( new Date( 90, 11, 15 ) );
|
|
||||||
em.getTransaction().begin();
|
|
||||||
int previousVersion = c.getManualVersion();
|
|
||||||
em.persist( c );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
c = em.find( Cat.class, c.getId() );
|
|
||||||
assertNotNull( c.getLastUpdate() );
|
|
||||||
assertTrue( previousVersion < c.getManualVersion() );
|
|
||||||
assertEquals( 12, c.getLength() );
|
|
||||||
previousVersion = c.getManualVersion();
|
|
||||||
c.setName( "new name" );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
c = em.find( Cat.class, c.getId() );
|
|
||||||
assertTrue( previousVersion < c.getManualVersion() );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPostPersist() throws Exception {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
Cat c = new Cat();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
c.setLength( 23 );
|
|
||||||
c.setAge( 2 );
|
|
||||||
c.setName( "Beetle" );
|
|
||||||
c.setDateOfBirth( new Date() );
|
|
||||||
em.persist( c );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
List ids = Cat.getIdList();
|
|
||||||
Object id = Cat.getIdList().get( ids.size() - 1 );
|
|
||||||
assertNotNull( id );
|
|
||||||
}
|
|
||||||
|
|
||||||
//Not a test since the spec did not make the proper change on listeners
|
|
||||||
public void listenerAnnotation() throws Exception {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
Translation tl = new Translation();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
tl.setInto( "France" );
|
|
||||||
em.persist( tl );
|
|
||||||
tl = new Translation();
|
|
||||||
tl.setInto( "Bimboland" );
|
|
||||||
try {
|
|
||||||
em.persist( tl );
|
|
||||||
em.flush();
|
|
||||||
fail( "Annotations annotated by a listener not used" );
|
|
||||||
}
|
|
||||||
catch (IllegalArgumentException e) {
|
|
||||||
//success
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
em.getTransaction().rollback();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPrePersistOnCascade() throws Exception {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Television tv = new Television();
|
|
||||||
RemoteControl rc = new RemoteControl();
|
|
||||||
em.persist( tv );
|
|
||||||
em.flush();
|
|
||||||
tv.setControl( rc );
|
|
||||||
tv.init();
|
|
||||||
em.flush();
|
|
||||||
assertNotNull( rc.getCreationDate() );
|
|
||||||
em.getTransaction().rollback();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCallBackListenersHierarchy() throws Exception {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Television tv = new Television();
|
|
||||||
em.persist( tv );
|
|
||||||
tv.setName( "Myaio" );
|
|
||||||
tv.init();
|
|
||||||
em.flush();
|
|
||||||
assertEquals( 1, tv.counter );
|
|
||||||
em.getTransaction().rollback();
|
|
||||||
em.close();
|
|
||||||
assertEquals( 5, tv.communication );
|
|
||||||
assertTrue( tv.isLast );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testException() throws Exception {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Rythm r = new Rythm();
|
|
||||||
try {
|
|
||||||
em.persist( r );
|
|
||||||
em.flush();
|
|
||||||
fail("should have raised an ArythmeticException:");
|
|
||||||
}
|
|
||||||
catch (ArithmeticException e) {
|
|
||||||
//success
|
|
||||||
}
|
|
||||||
catch( Exception e ) {
|
|
||||||
fail("should have raised an ArythmeticException:" + e.getClass() );
|
|
||||||
}
|
|
||||||
|
|
||||||
em.getTransaction().rollback();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIdNullSetByPrePersist() throws Exception {
|
|
||||||
Plant plant = new Plant();
|
|
||||||
plant.setName( "Origuna plantula gigantic" );
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( plant );
|
|
||||||
em.flush();
|
|
||||||
em.getTransaction().rollback();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@FailureExpected(message = "collection change does not trigger an event", jiraKey = "EJB-288")
|
|
||||||
public void testPostUpdateCollection() throws Exception {
|
|
||||||
// create a cat
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
Cat cat = new Cat();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
cat.setLength( 23 );
|
|
||||||
cat.setAge( 2 );
|
|
||||||
cat.setName( "Beetle" );
|
|
||||||
cat.setDateOfBirth( new Date() );
|
|
||||||
em.persist( cat );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
|
|
||||||
// assert it is persisted
|
|
||||||
List ids = Cat.getIdList();
|
|
||||||
Object id = Cat.getIdList().get( ids.size() - 1 );
|
|
||||||
assertNotNull( id );
|
|
||||||
|
|
||||||
// add a kitten to the cat - triggers PostCollectionRecreateEvent
|
|
||||||
int postVersion = Cat.postVersion;
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Kitten kitty = new Kitten();
|
|
||||||
kitty.setName("kitty");
|
|
||||||
List kittens = new ArrayList<Kitten>();
|
|
||||||
kittens.add(kitty);
|
|
||||||
cat.setKittens(kittens);
|
|
||||||
em.getTransaction().commit();
|
|
||||||
assertEquals("Post version should have been incremented.", postVersion + 1, Cat.postVersion);
|
|
||||||
|
|
||||||
// add another kitten - triggers PostCollectionUpdateEvent.
|
|
||||||
postVersion = Cat.postVersion;
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Kitten tom = new Kitten();
|
|
||||||
tom.setName("Tom");
|
|
||||||
cat.getKittens().add(tom);
|
|
||||||
em.getTransaction().commit();
|
|
||||||
assertEquals("Post version should have been incremented.", postVersion + 1, Cat.postVersion);
|
|
||||||
|
|
||||||
// delete a kitty - triggers PostCollectionUpdateEvent
|
|
||||||
postVersion = Cat.postVersion;
|
|
||||||
em.getTransaction().begin();
|
|
||||||
cat.getKittens().remove(tom);
|
|
||||||
em.getTransaction().commit();
|
|
||||||
assertEquals("Post version should have been incremented.", postVersion + 1, Cat.postVersion);
|
|
||||||
|
|
||||||
// delete and recreate kittens - triggers PostCollectionRemoveEvent and PostCollectionRecreateEvent)
|
|
||||||
postVersion = Cat.postVersion;
|
|
||||||
em.getTransaction().begin();
|
|
||||||
cat.setKittens(new ArrayList<Kitten>());
|
|
||||||
em.getTransaction().commit();
|
|
||||||
assertEquals("Post version should have been incremented.", postVersion + 2, Cat.postVersion);
|
|
||||||
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[]{
|
|
||||||
Cat.class,
|
|
||||||
Translation.class,
|
|
||||||
Television.class,
|
|
||||||
RemoteControl.class,
|
|
||||||
Rythm.class,
|
|
||||||
Plant.class,
|
|
||||||
Kitten.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.callbacks.hbmxml;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.AvailableSettings;
|
|
||||||
import org.hibernate.jpa.HibernateEntityManagerFactory;
|
|
||||||
import org.hibernate.jpa.boot.spi.Bootstrap;
|
|
||||||
import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Felix Feisst (feisst dot felix at gmail dot com)
|
|
||||||
*/
|
|
||||||
public class MappingClassMoreThanOnceTest extends BaseUnitTestCase {
|
|
||||||
/**
|
|
||||||
* Tests that an entity manager can be created when a class is mapped more than once.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
@TestForIssue(jiraKey = "HHH-8775")
|
|
||||||
// @FailureExpected(jiraKey = "HHH-8775")
|
|
||||||
public void testBootstrapWithClassMappedMOreThanOnce() {
|
|
||||||
Map settings = new HashMap( );
|
|
||||||
settings.put( AvailableSettings.HBXML_FILES, "org/hibernate/jpa/test/callbacks/hbmxml/ClassMappedMoreThanOnce.hbm.xml" );
|
|
||||||
|
|
||||||
final EntityManagerFactoryBuilder builder = Bootstrap.getEntityManagerFactoryBuilder(
|
|
||||||
new BaseEntityManagerFunctionalTestCase.TestingPersistenceUnitDescriptorImpl( getClass().getSimpleName() ),
|
|
||||||
settings
|
|
||||||
);
|
|
||||||
|
|
||||||
HibernateEntityManagerFactory emf = null;
|
|
||||||
try {
|
|
||||||
emf = builder.build().unwrap( HibernateEntityManagerFactory.class );
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if ( emf != null ) {
|
|
||||||
try {
|
|
||||||
emf.close();
|
|
||||||
}
|
|
||||||
catch (Exception ignore) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.callbacks.xml;
|
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Steve Ebersole
|
|
||||||
*/
|
|
||||||
public class EntityListenerViaXmlTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Override
|
|
||||||
protected String[] getMappings() {
|
|
||||||
return new String[] { "org/hibernate/jpa/test/callbacks/xml/MyEntity.orm.xml" };
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@TestForIssue( jiraKey = "HHH-9771" )
|
|
||||||
public void testUsage() {
|
|
||||||
JournalingListener.reset();
|
|
||||||
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( new MyEntity( 1, "steve" ) );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
assertEquals( 1, JournalingListener.getPrePersistCount() );
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.createQuery( "delete MyEntity" ).executeUpdate();
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,96 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cascade;
|
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.EntityTransaction;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Max Rydahl Andersen
|
|
||||||
*/
|
|
||||||
public class CascadeTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Test
|
|
||||||
public void testCascade() throws Exception {
|
|
||||||
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
|
|
||||||
Teacher teacher = new Teacher();
|
|
||||||
|
|
||||||
Student student = new Student();
|
|
||||||
|
|
||||||
teacher.setFavoriteStudent(student);
|
|
||||||
student.setFavoriteTeacher(teacher);
|
|
||||||
|
|
||||||
teacher.getStudents().add(student);
|
|
||||||
student.setPrimaryTeacher(teacher);
|
|
||||||
|
|
||||||
em.persist( teacher );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
|
|
||||||
Teacher foundTeacher = (Teacher) em.createQuery( "select t from Teacher as t" ).getSingleResult();
|
|
||||||
|
|
||||||
System.out.println(foundTeacher);
|
|
||||||
System.out.println(foundTeacher.getFavoriteStudent());
|
|
||||||
|
|
||||||
for (Student fstudent : foundTeacher.getStudents()) {
|
|
||||||
System.out.println(fstudent);
|
|
||||||
System.out.println(fstudent.getFavoriteTeacher());
|
|
||||||
System.out.println(fstudent.getPrimaryTeacher());
|
|
||||||
}
|
|
||||||
|
|
||||||
em.getTransaction().commit(); // here *alot* of flushes occur on an object graph that has *Zero* changes.
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testNoCascadeAndMerge() throws Exception {
|
|
||||||
Song e1 = new Song();
|
|
||||||
Author e2 = new Author();
|
|
||||||
|
|
||||||
e1.setAuthor(e2);
|
|
||||||
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
EntityTransaction tx = em.getTransaction();
|
|
||||||
tx.begin();
|
|
||||||
em.persist(e2);
|
|
||||||
em.persist(e1);
|
|
||||||
tx.commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
|
|
||||||
e1 = em.find(Song.class, e1.getId());
|
|
||||||
|
|
||||||
|
|
||||||
tx = em.getTransaction();
|
|
||||||
tx.begin();
|
|
||||||
em.merge(e1);
|
|
||||||
//em.refresh(e1);
|
|
||||||
tx.commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[]{
|
|
||||||
Teacher.class,
|
|
||||||
Student.class,
|
|
||||||
Song.class,
|
|
||||||
Author.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,101 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cascade;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.ObjectInputStream;
|
|
||||||
import java.io.ObjectOutput;
|
|
||||||
import java.io.ObjectOutputStream;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.EntityTransaction;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.Hibernate;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class DeleteOrphanTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Test
|
|
||||||
public void testDeleteOrphan() throws Exception {
|
|
||||||
EntityTransaction tx;
|
|
||||||
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
tx = em.getTransaction();
|
|
||||||
tx.begin();
|
|
||||||
Troop disney = new Troop();
|
|
||||||
|
|
||||||
disney.setName( "Disney" );
|
|
||||||
Soldier mickey = new Soldier();
|
|
||||||
mickey.setName( "Mickey" );
|
|
||||||
disney.addSoldier( mickey );
|
|
||||||
em.persist( disney );
|
|
||||||
tx.commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
tx = em.getTransaction();
|
|
||||||
tx.begin();
|
|
||||||
Troop troop = em.find( Troop.class, disney.getId() );
|
|
||||||
Hibernate.initialize( troop.getSoldiers() );
|
|
||||||
tx.commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
Soldier soldier = troop.getSoldiers().iterator().next();
|
|
||||||
troop.getSoldiers().remove( soldier );
|
|
||||||
troop = (Troop) deserialize( serialize( troop ) );
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
tx = em.getTransaction();
|
|
||||||
tx.begin();
|
|
||||||
em.merge( troop );
|
|
||||||
tx.commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
tx = em.getTransaction();
|
|
||||||
tx.begin();
|
|
||||||
soldier = em.find( Soldier.class, mickey.getId() );
|
|
||||||
Assert.assertNull( "delete-orphan should work", soldier );
|
|
||||||
troop = em.find( Troop.class, disney.getId() );
|
|
||||||
em.remove( troop );
|
|
||||||
tx.commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[]{
|
|
||||||
Troop.class,
|
|
||||||
Soldier.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private byte[] serialize(Object object) throws IOException {
|
|
||||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
|
||||||
ObjectOutput out = new ObjectOutputStream( stream );
|
|
||||||
out.writeObject( object );
|
|
||||||
out.close();
|
|
||||||
byte[] serialized = stream.toByteArray();
|
|
||||||
stream.close();
|
|
||||||
return serialized;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Object deserialize(byte[] serialized) throws IOException, ClassNotFoundException {
|
|
||||||
ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
|
|
||||||
ObjectInputStream in = new ObjectInputStream( byteIn );
|
|
||||||
Object result = in.readObject();
|
|
||||||
in.close();
|
|
||||||
byteIn.close();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,95 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cascade;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.ManyToOne;
|
|
||||||
import javax.persistence.OneToMany;
|
|
||||||
import javax.persistence.Table;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import static javax.persistence.CascadeType.DETACH;
|
|
||||||
import static javax.persistence.CascadeType.REMOVE;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class DetachAndContainsTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Test
|
|
||||||
public void testDetach() {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
|
|
||||||
Tooth tooth = new Tooth();
|
|
||||||
Mouth mouth = new Mouth();
|
|
||||||
em.persist( mouth );
|
|
||||||
em.persist( tooth );
|
|
||||||
tooth.mouth = mouth;
|
|
||||||
mouth.teeth = new ArrayList<Tooth>();
|
|
||||||
mouth.teeth.add( tooth );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
mouth = em.find( Mouth.class, mouth.id );
|
|
||||||
assertNotNull( mouth );
|
|
||||||
assertEquals( 1, mouth.teeth.size() );
|
|
||||||
tooth = mouth.teeth.iterator().next();
|
|
||||||
em.detach( mouth );
|
|
||||||
assertFalse( em.contains( tooth ) );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.remove( em.find( Mouth.class, mouth.id ) );
|
|
||||||
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[] {
|
|
||||||
Mouth.class,
|
|
||||||
Tooth.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "mouth")
|
|
||||||
public static class Mouth {
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
public Integer id;
|
|
||||||
@OneToMany(mappedBy = "mouth", cascade = { DETACH, REMOVE } )
|
|
||||||
public Collection<Tooth> teeth;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "tooth")
|
|
||||||
public static class Tooth {
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
public Integer id;
|
|
||||||
public String type;
|
|
||||||
@ManyToOne
|
|
||||||
public Mouth mouth;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,160 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cascade;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.EntityTransaction;
|
|
||||||
|
|
||||||
import org.hibernate.Hibernate;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class FetchTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Test
|
|
||||||
public void testCascadeAndFetchCollection() throws Exception {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Troop disney = new Troop();
|
|
||||||
disney.setName( "Disney" );
|
|
||||||
Soldier mickey = new Soldier();
|
|
||||||
mickey.setName( "Mickey" );
|
|
||||||
disney.addSoldier( mickey );
|
|
||||||
em.persist( disney );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Troop troop = em.find( Troop.class, disney.getId() );
|
|
||||||
assertFalse( Hibernate.isInitialized( troop.getSoldiers() ) );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
assertFalse( Hibernate.isInitialized( troop.getSoldiers() ) );
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
troop = em.find( Troop.class, disney.getId() );
|
|
||||||
em.remove( troop );
|
|
||||||
//Fail because of HHH-1187
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCascadeAndFetchEntity() throws Exception {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Troop disney = new Troop();
|
|
||||||
disney.setName( "Disney" );
|
|
||||||
Soldier mickey = new Soldier();
|
|
||||||
mickey.setName( "Mickey" );
|
|
||||||
disney.addSoldier( mickey );
|
|
||||||
em.persist( disney );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Soldier soldier = em.find( Soldier.class, mickey.getId() );
|
|
||||||
assertFalse( Hibernate.isInitialized( soldier.getTroop() ) );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
assertFalse( Hibernate.isInitialized( soldier.getTroop() ) );
|
|
||||||
em.close();
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Troop troop = em.find( Troop.class, disney.getId() );
|
|
||||||
em.remove( troop );
|
|
||||||
//Fail because of HHH-1187
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testTwoLevelDeepPersist() throws Exception {
|
|
||||||
EntityTransaction tx;
|
|
||||||
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
tx = em.getTransaction();
|
|
||||||
tx.begin();
|
|
||||||
Conference jbwBarcelona = new Conference();
|
|
||||||
jbwBarcelona.setDate( new Date() );
|
|
||||||
ExtractionDocumentInfo info = new ExtractionDocumentInfo();
|
|
||||||
info.setConference( jbwBarcelona );
|
|
||||||
jbwBarcelona.setExtractionDocument( info );
|
|
||||||
info.setLastModified( new Date() );
|
|
||||||
ExtractionDocument doc = new ExtractionDocument();
|
|
||||||
doc.setDocumentInfo( info );
|
|
||||||
info.setDocuments( new ArrayList<ExtractionDocument>() );
|
|
||||||
info.getDocuments().add( doc );
|
|
||||||
doc.setBody( new byte[]{'c', 'f'} );
|
|
||||||
em.persist( jbwBarcelona );
|
|
||||||
tx.commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
tx = em.getTransaction();
|
|
||||||
tx.begin();
|
|
||||||
jbwBarcelona = em.find( Conference.class, jbwBarcelona.getId() );
|
|
||||||
assertTrue( Hibernate.isInitialized( jbwBarcelona ) );
|
|
||||||
assertTrue( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument() ) );
|
|
||||||
assertFalse( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument().getDocuments() ) );
|
|
||||||
em.flush();
|
|
||||||
assertTrue( Hibernate.isInitialized( jbwBarcelona ) );
|
|
||||||
assertTrue( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument() ) );
|
|
||||||
assertFalse( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument().getDocuments() ) );
|
|
||||||
em.remove( jbwBarcelona );
|
|
||||||
tx.commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testTwoLevelDeepPersistOnManyToOne() throws Exception {
|
|
||||||
EntityTransaction tx;
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
tx = em.getTransaction();
|
|
||||||
tx.begin();
|
|
||||||
Grandson gs = new Grandson();
|
|
||||||
gs.setParent( new Son() );
|
|
||||||
gs.getParent().setParent( new Parent() );
|
|
||||||
em.persist( gs );
|
|
||||||
tx.commit();
|
|
||||||
em.close();
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
tx = em.getTransaction();
|
|
||||||
tx.begin();
|
|
||||||
gs = em.find( Grandson.class, gs.getId() );
|
|
||||||
em.flush();
|
|
||||||
assertTrue( Hibernate.isInitialized( gs.getParent() ) );
|
|
||||||
assertFalse( Hibernate.isInitialized( gs.getParent().getParent() ) );
|
|
||||||
em.remove( gs );
|
|
||||||
tx.commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[]{
|
|
||||||
Troop.class,
|
|
||||||
Soldier.class,
|
|
||||||
Conference.class,
|
|
||||||
ExtractionDocument.class,
|
|
||||||
ExtractionDocumentInfo.class,
|
|
||||||
Parent.class,
|
|
||||||
Son.class,
|
|
||||||
Grandson.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,77 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cascade;
|
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
|
|
||||||
public class FetchTest2 extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Test
|
|
||||||
public void testProxyTransientStuff() throws Exception {
|
|
||||||
EntityManager em = entityManagerFactory().createEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
|
|
||||||
Troop2 disney = new Troop2();
|
|
||||||
disney.setName( "Disney" );
|
|
||||||
|
|
||||||
Soldier2 mickey = new Soldier2();
|
|
||||||
mickey.setName( "Mickey" );
|
|
||||||
mickey.setTroop( disney );
|
|
||||||
|
|
||||||
em.persist( disney );
|
|
||||||
em.persist( mickey );
|
|
||||||
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = entityManagerFactory().createEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
|
|
||||||
Soldier2 soldier = em.find( Soldier2.class, mickey.getId() );
|
|
||||||
soldier.getTroop().getId();
|
|
||||||
try {
|
|
||||||
em.flush();
|
|
||||||
}
|
|
||||||
catch (IllegalStateException e) {
|
|
||||||
fail( "Should not raise an exception" );
|
|
||||||
}
|
|
||||||
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = entityManagerFactory().createEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
|
|
||||||
//load troop wo a proxy
|
|
||||||
disney = em.find( Troop2.class, disney.getId() );
|
|
||||||
soldier = em.find( Soldier2.class, mickey.getId() );
|
|
||||||
|
|
||||||
try {
|
|
||||||
em.flush();
|
|
||||||
}
|
|
||||||
catch (IllegalStateException e) {
|
|
||||||
fail( "Should not raise an exception" );
|
|
||||||
}
|
|
||||||
em.remove( soldier );
|
|
||||||
em.remove( disney );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[]{
|
|
||||||
Troop2.class,
|
|
||||||
Soldier2.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,131 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cascade;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.persistence.CascadeType;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.ManyToOne;
|
|
||||||
import javax.persistence.OneToMany;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
|
|
||||||
public class MergeTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMergeDetachedEntityWithNewOneToManyElements() {
|
|
||||||
Order order = new Order();
|
|
||||||
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( order );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
Item item1 = new Item();
|
|
||||||
item1.name = "i1";
|
|
||||||
|
|
||||||
Item item2 = new Item();
|
|
||||||
item2.name = "i2";
|
|
||||||
|
|
||||||
order.addItem( item1 );
|
|
||||||
order.addItem( item2 );
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
order = em.merge( order );
|
|
||||||
em.flush();
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
order = em.find( Order.class, order.id );
|
|
||||||
assertEquals( 2, order.items.size() );
|
|
||||||
em.remove( order );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMergeLoadedEntityWithNewOneToManyElements() {
|
|
||||||
Order order = new Order();
|
|
||||||
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( order );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
order = em.find( Order.class, order.id );
|
|
||||||
Item item1 = new Item();
|
|
||||||
item1.name = "i1";
|
|
||||||
Item item2 = new Item();
|
|
||||||
item2.name = "i2";
|
|
||||||
order.addItem( item1 );
|
|
||||||
order.addItem( item2 );
|
|
||||||
order = em.merge( order );
|
|
||||||
em.flush();
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
order = em.find( Order.class, order.id );
|
|
||||||
assertEquals( 2, order.items.size() );
|
|
||||||
em.remove( order );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[] {
|
|
||||||
Order.class,
|
|
||||||
Item.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
private static class Order {
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
@OneToMany(cascade = CascadeType.ALL, mappedBy = "order", orphanRemoval = true)
|
|
||||||
private List<Item> items = new ArrayList<Item>();
|
|
||||||
|
|
||||||
public Order() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addItem(Item item) {
|
|
||||||
items.add( item );
|
|
||||||
item.order = this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
private static class Item {
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
@ManyToOne
|
|
||||||
private Order order;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,86 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cascade;
|
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.ManyToOne;
|
|
||||||
|
|
||||||
import org.hibernate.LockMode;
|
|
||||||
import org.hibernate.Session;
|
|
||||||
import org.hibernate.annotations.GenericGenerator;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Steve Ebersole
|
|
||||||
*/
|
|
||||||
public class MergeWithTransientNonCascadedAssociationTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[] { Person.class, Address.class };
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMergeWithTransientNonCascadedAssociation() {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Person person = new Person();
|
|
||||||
em.persist( person );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
person.address = new Address();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.merge( person );
|
|
||||||
try {
|
|
||||||
em.flush();
|
|
||||||
fail( "Expecting IllegalStateException" );
|
|
||||||
}
|
|
||||||
catch (IllegalStateException ise) {
|
|
||||||
// expected...
|
|
||||||
em.getTransaction().rollback();
|
|
||||||
}
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
person.address = null;
|
|
||||||
em.unwrap( Session.class ).lock( person, LockMode.NONE );
|
|
||||||
em.unwrap( Session.class ).delete( person );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Entity( name = "Person" )
|
|
||||||
public static class Person {
|
|
||||||
@Id
|
|
||||||
@GeneratedValue( generator = "increment" )
|
|
||||||
@GenericGenerator( name = "increment", strategy = "increment" )
|
|
||||||
private Integer id;
|
|
||||||
@ManyToOne
|
|
||||||
private Address address;
|
|
||||||
|
|
||||||
public Person() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Entity( name = "Address" )
|
|
||||||
public static class Address {
|
|
||||||
@Id
|
|
||||||
@GeneratedValue( generator = "increment_1" )
|
|
||||||
@GenericGenerator( name = "increment_1", strategy = "increment" )
|
|
||||||
private Integer id;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,317 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cascade.multicircle;
|
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.RollbackException;
|
|
||||||
|
|
||||||
import org.hibernate.TransientPropertyValueException;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.FailureExpected;
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import junit.framework.Assert;
|
|
||||||
|
|
||||||
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This test uses a complicated model that requires Hibernate to delay
|
|
||||||
* inserts until non-nullable transient entity dependencies are resolved.
|
|
||||||
*
|
|
||||||
* All IDs are generated from a sequence.
|
|
||||||
*
|
|
||||||
* JPA cascade types are used (javax.persistence.CascadeType)..
|
|
||||||
*
|
|
||||||
* This test uses the following model:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* ------------------------------ N G
|
|
||||||
* |
|
|
||||||
* | 1
|
|
||||||
* | |
|
|
||||||
* | |
|
|
||||||
* | N
|
|
||||||
* |
|
|
||||||
* | E N--------------0,1 * F
|
|
||||||
* |
|
|
||||||
* | 1 N
|
|
||||||
* | | |
|
|
||||||
* | | |
|
|
||||||
* 1 N |
|
|
||||||
* * |
|
|
||||||
* B * N---1 D * 1------------------
|
|
||||||
* *
|
|
||||||
* N N
|
|
||||||
* | |
|
|
||||||
* | |
|
|
||||||
* 1 |
|
|
||||||
* |
|
|
||||||
* C * 1-----
|
|
||||||
*</code>
|
|
||||||
*
|
|
||||||
* In the diagram, all associations are bidirectional;
|
|
||||||
* assocations marked with '*' cascade persist, save, merge operations to the
|
|
||||||
* associated entities (e.g., B cascades persist to D, but D does not cascade
|
|
||||||
* persist to B);
|
|
||||||
*
|
|
||||||
* b, c, d, e, f, and g are all transient unsaved that are associated with each other.
|
|
||||||
*
|
|
||||||
* When saving b, the entities are added to the ActionQueue in the following order:
|
|
||||||
* c, d (depends on e), f (depends on d, g), e, b, g.
|
|
||||||
*
|
|
||||||
* Entities are inserted in the following order:
|
|
||||||
* c, e, d, b, g, f.
|
|
||||||
*/
|
|
||||||
public class MultiCircleJpaCascadeTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
private B b;
|
|
||||||
private C c;
|
|
||||||
private D d;
|
|
||||||
private E e;
|
|
||||||
private F f;
|
|
||||||
private G g;
|
|
||||||
private boolean skipCleanup;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setup() {
|
|
||||||
b = new B();
|
|
||||||
c = new C();
|
|
||||||
d = new D();
|
|
||||||
e = new E();
|
|
||||||
f = new F();
|
|
||||||
g = new G();
|
|
||||||
|
|
||||||
b.getGCollection().add( g );
|
|
||||||
b.setC( c );
|
|
||||||
b.setD( d );
|
|
||||||
|
|
||||||
c.getBCollection().add( b );
|
|
||||||
c.getDCollection().add( d );
|
|
||||||
|
|
||||||
d.getBCollection().add( b );
|
|
||||||
d.setC( c );
|
|
||||||
d.setE( e );
|
|
||||||
d.getFCollection().add( f );
|
|
||||||
|
|
||||||
e.getDCollection().add( d );
|
|
||||||
e.setF( f );
|
|
||||||
|
|
||||||
f.getECollection().add( e );
|
|
||||||
f.setD( d );
|
|
||||||
f.setG( g );
|
|
||||||
|
|
||||||
g.setB( b );
|
|
||||||
g.getFCollection().add( f );
|
|
||||||
|
|
||||||
skipCleanup = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void cleanup() {
|
|
||||||
if ( ! skipCleanup ) {
|
|
||||||
b.setC( null );
|
|
||||||
b.setD( null );
|
|
||||||
b.getGCollection().remove( g );
|
|
||||||
|
|
||||||
c.getBCollection().remove( b );
|
|
||||||
c.getDCollection().remove( d );
|
|
||||||
|
|
||||||
d.getBCollection().remove( b );
|
|
||||||
d.setC( null );
|
|
||||||
d.setE( null );
|
|
||||||
d.getFCollection().remove( f );
|
|
||||||
|
|
||||||
e.getDCollection().remove( d );
|
|
||||||
e.setF( null );
|
|
||||||
|
|
||||||
f.setD( null );
|
|
||||||
f.getECollection().remove( e );
|
|
||||||
f.setG( null );
|
|
||||||
|
|
||||||
g.setB( null );
|
|
||||||
g.getFCollection().remove( f );
|
|
||||||
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
b = em.merge( b );
|
|
||||||
c = em.merge( c );
|
|
||||||
d = em.merge( d );
|
|
||||||
e = em.merge( e );
|
|
||||||
f = em.merge( f );
|
|
||||||
g = em.merge( g );
|
|
||||||
em.remove( f );
|
|
||||||
em.remove( g );
|
|
||||||
em.remove( b );
|
|
||||||
em.remove( d );
|
|
||||||
em.remove( e );
|
|
||||||
em.remove( c );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPersist() {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( b );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
check();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPersistNoCascadeToTransient() {
|
|
||||||
skipCleanup = true;
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
try {
|
|
||||||
em.persist( c );
|
|
||||||
fail( "should have failed." );
|
|
||||||
}
|
|
||||||
catch( IllegalStateException ex ) {
|
|
||||||
assertTrue( TransientPropertyValueException.class.isInstance( ex.getCause() ) );
|
|
||||||
TransientPropertyValueException pve = (TransientPropertyValueException) ex.getCause();
|
|
||||||
assertEquals( G.class.getName(), pve.getTransientEntityName() );
|
|
||||||
assertEquals( F.class.getName(), pve.getPropertyOwnerEntityName() );
|
|
||||||
assertEquals( "g", pve.getPropertyName() );
|
|
||||||
}
|
|
||||||
em.getTransaction().rollback();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@FailureExpected( jiraKey = "HHH-6999" )
|
|
||||||
// fails on d.e; should pass
|
|
||||||
public void testPersistThenUpdate() {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( b );
|
|
||||||
// remove old e from associations
|
|
||||||
e.getDCollection().remove( d );
|
|
||||||
d.setE( null );
|
|
||||||
f.getECollection().remove( e );
|
|
||||||
e.setF( null );
|
|
||||||
// add new e to associations
|
|
||||||
e = new E();
|
|
||||||
e.getDCollection().add( d );
|
|
||||||
f.getECollection().add( e );
|
|
||||||
d.setE( e );
|
|
||||||
e.setF( f );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
check();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPersistThenUpdateNoCascadeToTransient() {
|
|
||||||
// expected to fail, so nothing will be persisted.
|
|
||||||
skipCleanup = true;
|
|
||||||
|
|
||||||
// remove elements from collections and persist
|
|
||||||
c.getBCollection().clear();
|
|
||||||
c.getDCollection().clear();
|
|
||||||
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.persist( c );
|
|
||||||
// now add the elements back
|
|
||||||
c.getBCollection().add( b );
|
|
||||||
c.getDCollection().add( d );
|
|
||||||
try {
|
|
||||||
em.getTransaction().commit();
|
|
||||||
fail( "should have thrown IllegalStateException");
|
|
||||||
}
|
|
||||||
catch ( RollbackException ex ) {
|
|
||||||
assertTrue( ex.getCause() instanceof IllegalStateException );
|
|
||||||
IllegalStateException ise = ( IllegalStateException ) ex.getCause();
|
|
||||||
// should fail on entity g (due to no cascade to f.g);
|
|
||||||
// instead it fails on entity e ( due to no cascade to d.e)
|
|
||||||
// because e is not in the process of being saved yet.
|
|
||||||
// when HHH-6999 is fixed, this test should be changed to
|
|
||||||
// check for g and f.g
|
|
||||||
//noinspection ThrowableResultOfMethodCallIgnored
|
|
||||||
TransientPropertyValueException tpve = assertTyping( TransientPropertyValueException.class, ise.getCause() );
|
|
||||||
assertEquals( E.class.getName(), tpve.getTransientEntityName() );
|
|
||||||
assertEquals( D.class.getName(), tpve.getPropertyOwnerEntityName() );
|
|
||||||
assertEquals( "e", tpve.getPropertyName() );
|
|
||||||
}
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMerge() {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
b = em.merge( b );
|
|
||||||
c = b.getC();
|
|
||||||
d = b.getD();
|
|
||||||
e = d.getE();
|
|
||||||
f = e.getF();
|
|
||||||
g = f.getG();
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
check();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void check() {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
B bRead = em.find( B.class, b.getId() );
|
|
||||||
Assert.assertEquals( b, bRead );
|
|
||||||
|
|
||||||
G gRead = bRead.getGCollection().iterator().next();
|
|
||||||
Assert.assertEquals( g, gRead );
|
|
||||||
C cRead = bRead.getC();
|
|
||||||
Assert.assertEquals( c, cRead );
|
|
||||||
D dRead = bRead.getD();
|
|
||||||
Assert.assertEquals( d, dRead );
|
|
||||||
|
|
||||||
Assert.assertSame( bRead, cRead.getBCollection().iterator().next() );
|
|
||||||
Assert.assertSame( dRead, cRead.getDCollection().iterator().next() );
|
|
||||||
|
|
||||||
Assert.assertSame( bRead, dRead.getBCollection().iterator().next() );
|
|
||||||
Assert.assertEquals( cRead, dRead.getC() );
|
|
||||||
E eRead = dRead.getE();
|
|
||||||
Assert.assertEquals( e, eRead );
|
|
||||||
F fRead = dRead.getFCollection().iterator().next();
|
|
||||||
Assert.assertEquals( f, fRead );
|
|
||||||
|
|
||||||
Assert.assertSame( dRead, eRead.getDCollection().iterator().next() );
|
|
||||||
Assert.assertSame( fRead, eRead.getF() );
|
|
||||||
|
|
||||||
Assert.assertSame( eRead, fRead.getECollection().iterator().next() );
|
|
||||||
Assert.assertSame( dRead, fRead.getD() );
|
|
||||||
Assert.assertSame( gRead, fRead.getG());
|
|
||||||
|
|
||||||
Assert.assertSame( bRead, gRead.getB() );
|
|
||||||
Assert.assertSame( fRead, gRead.getFCollection().iterator().next() );
|
|
||||||
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[]{
|
|
||||||
B.class,
|
|
||||||
C.class,
|
|
||||||
D.class,
|
|
||||||
E.class,
|
|
||||||
F.class,
|
|
||||||
G.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.cascade.multilevel;
|
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.EntityTransaction;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
|
||||||
import org.hibernate.testing.transaction.TransactionUtil;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static org.junit.Assert.assertSame;
|
|
||||||
|
|
||||||
public class MultiLevelCascadeTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
|
|
||||||
@TestForIssue( jiraKey = "HHH-5299" )
|
|
||||||
@Test
|
|
||||||
public void test() {
|
|
||||||
final Top top = new Top();
|
|
||||||
;
|
|
||||||
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
|
||||||
|
|
||||||
entityManager.persist( top );
|
|
||||||
// Flush 1
|
|
||||||
entityManager.flush();
|
|
||||||
|
|
||||||
Middle middle = new Middle( 1l );
|
|
||||||
top.addMiddle( middle );
|
|
||||||
middle.setTop( top );
|
|
||||||
Bottom bottom = new Bottom();
|
|
||||||
middle.setBottom( bottom );
|
|
||||||
bottom.setMiddle( middle );
|
|
||||||
|
|
||||||
Middle middle2 = new Middle( 2l );
|
|
||||||
top.addMiddle( middle2 );
|
|
||||||
middle2.setTop( top );
|
|
||||||
Bottom bottom2 = new Bottom();
|
|
||||||
middle2.setBottom( bottom2 );
|
|
||||||
bottom2.setMiddle( middle2 );
|
|
||||||
// Flush 2
|
|
||||||
entityManager.flush();
|
|
||||||
} );
|
|
||||||
|
|
||||||
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
|
||||||
|
|
||||||
Top finded = entityManager.find( Top.class, top.getId() );
|
|
||||||
|
|
||||||
assertEquals( 2, finded.getMiddles().size() );
|
|
||||||
for ( Middle loadedMiddle : finded.getMiddles() ) {
|
|
||||||
assertSame( finded, loadedMiddle.getTop() );
|
|
||||||
assertNotNull( loadedMiddle.getBottom() );
|
|
||||||
}
|
|
||||||
entityManager.remove( finded );
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[] { Top.class, Middle.class, Bottom.class };
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -26,9 +26,9 @@ import org.hibernate.ScrollMode;
|
||||||
import org.hibernate.ScrollableResults;
|
import org.hibernate.ScrollableResults;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
||||||
import org.hibernate.jpa.test.callbacks.RemoteControl;
|
import org.hibernate.orm.test.jpa.callbacks.RemoteControl;
|
||||||
import org.hibernate.jpa.test.callbacks.Television;
|
import org.hibernate.orm.test.jpa.callbacks.Television;
|
||||||
import org.hibernate.jpa.test.callbacks.VideoSystem;
|
import org.hibernate.orm.test.jpa.callbacks.VideoSystem;
|
||||||
import org.hibernate.jpa.test.inheritance.Fruit;
|
import org.hibernate.jpa.test.inheritance.Fruit;
|
||||||
import org.hibernate.jpa.test.inheritance.Strawberry;
|
import org.hibernate.jpa.test.inheritance.Strawberry;
|
||||||
import org.hibernate.jpa.test.metamodel.Address;
|
import org.hibernate.jpa.test.metamodel.Address;
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.beanvalidation;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.dialect.H2Dialect;
|
||||||
|
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.Jpa;
|
||||||
|
import org.hibernate.testing.orm.junit.RequiresDialect;
|
||||||
|
import org.hibernate.testing.orm.junit.Setting;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import javax.persistence.RollbackException;
|
||||||
|
import javax.validation.ConstraintViolationException;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Jpa(
|
||||||
|
annotatedClasses = { CupHolder.class },
|
||||||
|
integrationSettings = { @Setting(name = AvailableSettings.JPA_VALIDATION_MODE, value = "auto") }
|
||||||
|
)
|
||||||
|
public class BeanValidationTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBeanValidationIntegrationOnFlush(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inEntityManager(
|
||||||
|
entityManager -> {
|
||||||
|
CupHolder ch = new CupHolder();
|
||||||
|
ch.setRadius( new BigDecimal( "12" ) );
|
||||||
|
ch.setTitle( "foo" );
|
||||||
|
entityManager.getTransaction().begin();
|
||||||
|
try {
|
||||||
|
entityManager.persist(ch);
|
||||||
|
entityManager.flush();
|
||||||
|
fail( "invalid object should not be persisted" );
|
||||||
|
}
|
||||||
|
catch (ConstraintViolationException e) {
|
||||||
|
assertEquals( 1, e.getConstraintViolations().size() );
|
||||||
|
}
|
||||||
|
assertTrue(
|
||||||
|
entityManager.getTransaction().getRollbackOnly(),
|
||||||
|
"A constraint violation exception should mark the transaction for rollback"
|
||||||
|
);
|
||||||
|
entityManager.getTransaction().rollback();
|
||||||
|
entityManager.clear();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBeanValidationIntegrationOnCommit(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inEntityManager(
|
||||||
|
entityManager -> {
|
||||||
|
CupHolder ch = new CupHolder();
|
||||||
|
ch.setRadius(new BigDecimal("9"));
|
||||||
|
ch.setTitle("foo");
|
||||||
|
entityManager.getTransaction().begin();
|
||||||
|
entityManager.persist(ch);
|
||||||
|
entityManager.flush();
|
||||||
|
try {
|
||||||
|
ch.setRadius(new BigDecimal("12"));
|
||||||
|
entityManager.getTransaction().commit();
|
||||||
|
fail("invalid object should not be persisted");
|
||||||
|
}
|
||||||
|
catch (RollbackException e) {
|
||||||
|
final Throwable cve = e.getCause();
|
||||||
|
assertTrue(cve instanceof ConstraintViolationException);
|
||||||
|
assertEquals(1, ((ConstraintViolationException) cve).getConstraintViolations().size());
|
||||||
|
}
|
||||||
|
entityManager.close();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@RequiresDialect(H2Dialect.class)
|
||||||
|
public void testTitleColumnHasExpectedLength(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inEntityManager(
|
||||||
|
entityManager -> {
|
||||||
|
int len = (Integer) entityManager.createNativeQuery(
|
||||||
|
"select CHARACTER_MAXIMUM_LENGTH from INFORMATION_SCHEMA.COLUMNS c where c.TABLE_NAME = 'CUPHOLDER' and c.COLUMN_NAME = 'TITLE'"
|
||||||
|
).getSingleResult();
|
||||||
|
assertEquals(64, len);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.beanvalidation;
|
package org.hibernate.orm.test.jpa.beanvalidation;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.beanvalidation;
|
package org.hibernate.orm.test.jpa.beanvalidation;
|
||||||
|
|
||||||
import java.lang.annotation.Documented;
|
import java.lang.annotation.Documented;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.beanvalidation;
|
package org.hibernate.orm.test.jpa.beanvalidation;
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -13,7 +13,7 @@ import javax.persistence.EntityManagerFactory;
|
||||||
import javax.validation.Validation;
|
import javax.validation.Validation;
|
||||||
import javax.validation.ValidatorFactory;
|
import javax.validation.ValidatorFactory;
|
||||||
|
|
||||||
import org.hibernate.jpa.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.jpa.HibernatePersistenceProvider;
|
import org.hibernate.jpa.HibernatePersistenceProvider;
|
||||||
import org.hibernate.jpa.boot.spi.Bootstrap;
|
import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||||
import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder;
|
import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder;
|
||||||
|
@ -24,7 +24,7 @@ import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.assertSame;
|
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test injection of ValidatorFactory using WF/Hibernate 2-phase boot process
|
* Test injection of ValidatorFactory using WF/Hibernate 2-phase boot process
|
||||||
|
@ -62,7 +62,7 @@ public class ValidatorFactory2PhaseInjectionTest extends BaseUnitTestCase {
|
||||||
|
|
||||||
EntityManagerFactory emf = emfb.build();
|
EntityManagerFactory emf = emfb.build();
|
||||||
try {
|
try {
|
||||||
assertSame( vf, emf.getProperties().get( AvailableSettings.VALIDATION_FACTORY ) );
|
assertSame( vf, emf.getProperties().get( AvailableSettings.JPA_VALIDATION_FACTORY ) );
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
emf.close();
|
emf.close();
|
|
@ -4,10 +4,8 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.boot;
|
package org.hibernate.orm.test.jpa.boot;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.MalformedURLException;
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -19,10 +17,9 @@ import javax.persistence.EntityManagerFactory;
|
||||||
import javax.persistence.Persistence;
|
import javax.persistence.Persistence;
|
||||||
|
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.internal.util.ConfigHelper;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
import org.hibernate.service.spi.ServiceException;
|
import org.hibernate.service.spi.ServiceException;
|
||||||
|
|
||||||
|
import org.hibernate.testing.boot.ClassLoaderServiceTestingImpl;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,7 +29,7 @@ import org.junit.Test;
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
||||||
* @author Sanne Grinovero
|
* @author Sanne Grinovero
|
||||||
*/
|
*/
|
||||||
public class BootFailureTest extends BaseEntityManagerFunctionalTestCase {
|
public class BootFailureTest {
|
||||||
|
|
||||||
@Test(expected = ServiceException.class)
|
@Test(expected = ServiceException.class)
|
||||||
public void exceptionOnIllegalPUTest() {
|
public void exceptionOnIllegalPUTest() {
|
||||||
|
@ -57,7 +54,8 @@ public class BootFailureTest extends BaseEntityManagerFunctionalTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class TestClassLoader extends ClassLoader {
|
private static class TestClassLoader extends ClassLoader {
|
||||||
static final List<URL> urls = Arrays.asList( ConfigHelper.findAsResource( "org/hibernate/jpa/test/bootstrap/META-INF/persistence.xml" ) );
|
static final List<URL> urls = Arrays.asList( ClassLoaderServiceTestingImpl.INSTANCE.locateResource(
|
||||||
|
"org/hibernate/orm/test/jpa/boot/META-INF/persistence.xml" ) );
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Enumeration<URL> findResources(String name) {
|
protected Enumeration<URL> findResources(String name) {
|
||||||
|
@ -66,6 +64,5 @@ public class BootFailureTest extends BaseEntityManagerFunctionalTestCase {
|
||||||
Collections.emptyEnumeration();
|
Collections.emptyEnumeration();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.boot;
|
package org.hibernate.orm.test.jpa.boot;
|
||||||
|
|
||||||
|
|
||||||
import org.hibernate.internal.HEMLogging;
|
import org.hibernate.internal.HEMLogging;
|
||||||
|
@ -17,8 +17,8 @@ import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that deprecated (and removed) provider, "org.hibernate.ejb.HibernatePersistence",
|
* Tests that deprecated (and removed) provider, "org.hibernate.ejb.HibernatePersistence",
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.boot;
|
package org.hibernate.orm.test.jpa.boot;
|
||||||
|
|
||||||
import javax.persistence.EntityManagerFactory;
|
import javax.persistence.EntityManagerFactory;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cacheable.annotation;
|
package org.hibernate.orm.test.jpa.cacheable.annotation;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -15,7 +15,7 @@ import javax.persistence.SharedCacheMode;
|
||||||
import org.hibernate.boot.spi.MetadataImplementor;
|
import org.hibernate.boot.spi.MetadataImplementor;
|
||||||
import org.hibernate.cache.spi.access.AccessType;
|
import org.hibernate.cache.spi.access.AccessType;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
import org.hibernate.jpa.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
|
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
|
||||||
import org.hibernate.jpa.boot.spi.Bootstrap;
|
import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||||
import org.hibernate.jpa.test.PersistenceUnitInfoAdapter;
|
import org.hibernate.jpa.test.PersistenceUnitInfoAdapter;
|
||||||
|
@ -30,8 +30,6 @@ import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* this is hacky transient step until EMF building is integrated with metamodel
|
|
||||||
*
|
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class ConfigurationTest extends BaseUnitTestCase {
|
public class ConfigurationTest extends BaseUnitTestCase {
|
||||||
|
@ -117,7 +115,7 @@ public class ConfigurationTest extends BaseUnitTestCase {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private MetadataImplementor buildMetadata(SharedCacheMode mode) {
|
private MetadataImplementor buildMetadata(SharedCacheMode mode) {
|
||||||
Map settings = new HashMap();
|
Map settings = new HashMap();
|
||||||
settings.put( AvailableSettings.SHARED_CACHE_MODE, mode );
|
settings.put( AvailableSettings.JPA_SHARED_CACHE_MODE, mode );
|
||||||
settings.put( Environment.CACHE_REGION_FACTORY, CustomRegionFactory.class.getName() );
|
settings.put( Environment.CACHE_REGION_FACTORY, CustomRegionFactory.class.getName() );
|
||||||
settings.put(
|
settings.put(
|
||||||
AvailableSettings.LOADED_CLASSES,
|
AvailableSettings.LOADED_CLASSES,
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cacheable.annotation;
|
package org.hibernate.orm.test.jpa.cacheable.annotation;
|
||||||
import javax.persistence.Cacheable;
|
import javax.persistence.Cacheable;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cacheable.annotation;
|
package org.hibernate.orm.test.jpa.cacheable.annotation;
|
||||||
import javax.persistence.Cacheable;
|
import javax.persistence.Cacheable;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cacheable.annotation;
|
package org.hibernate.orm.test.jpa.cacheable.annotation;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cacheable.api;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.SharedCacheMode;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.hibernate.NotYetImplementedFor6Exception;
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import org.hibernate.testing.cache.CachingRegionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.NotImplementedYet;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
// TODO Convert to annotation based testing? Setting the CachingRegionFactory as below leads to a CNFE
|
||||||
|
//@DomainModel(
|
||||||
|
// annotatedClasses = Order.class
|
||||||
|
//)
|
||||||
|
//@ServiceRegistry(
|
||||||
|
// settings = {
|
||||||
|
// @Setting(name = AvailableSettings.CACHE_REGION_FACTORY, value = "CachingRegionFactory.class"),
|
||||||
|
// @Setting(name = AvailableSettings.JPA_SHARED_CACHE_MODE, value = "ALL")
|
||||||
|
// }
|
||||||
|
//)
|
||||||
|
//@SessionFactory
|
||||||
|
public class JpaCacheApiUsageTest /*extends BaseEntityManagerFunctionalTestCase*/ {
|
||||||
|
// @Override
|
||||||
|
// protected Class<?>[] getAnnotatedClasses() {
|
||||||
|
// return new Class[] { Order.class };
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// @SuppressWarnings("unchecked")
|
||||||
|
// protected void addConfigOptions(Map options) {
|
||||||
|
//// options.put( AvailableSettings.USE_SECOND_LEVEL_CACHE, "true" );
|
||||||
|
// options.put( AvailableSettings.CACHE_REGION_FACTORY, CachingRegionFactory.class.getName() );
|
||||||
|
//// options.put( AvailableSettings.DEFAULT_CACHE_CONCURRENCY_STRATEGY, "read-write" );
|
||||||
|
// options.put( org.hibernate.jpa.AvailableSettings.SHARED_CACHE_MODE, SharedCacheMode.ALL );
|
||||||
|
// }
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@NotImplementedYet(reason = "BulkOperationCleanupAction is never created", expectedVersion = "6.0")
|
||||||
|
public void testEviction() {
|
||||||
|
throw new NotYetImplementedFor6Exception();
|
||||||
|
// first create an Order
|
||||||
|
// EntityManager em = getOrCreateEntityManager();
|
||||||
|
// em.getTransaction().begin();
|
||||||
|
// em.persist( new Order( 1, 500 ) );
|
||||||
|
// em.getTransaction().commit();
|
||||||
|
// em.close();
|
||||||
|
//
|
||||||
|
// assertTrue( entityManagerFactory().getCache().contains( Order.class, 1 ) );
|
||||||
|
//
|
||||||
|
// em = getOrCreateEntityManager();
|
||||||
|
// em.getTransaction().begin();
|
||||||
|
// assertTrue( entityManagerFactory().getCache().contains( Order.class, 1 ) );
|
||||||
|
// em.createQuery( "delete Order" ).executeUpdate();
|
||||||
|
// em.getTransaction().commit();
|
||||||
|
// em.close();
|
||||||
|
//
|
||||||
|
// assertFalse( entityManagerFactory().getCache().contains( Order.class, 1 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Test
|
||||||
|
// public void testEviction(SessionFactoryScope scope) {
|
||||||
|
// scope.inTransaction(
|
||||||
|
// session -> {
|
||||||
|
// session.getTransaction().begin();
|
||||||
|
// session.persist( new Order( 1, 500 ) );
|
||||||
|
// session.getTransaction().commit();
|
||||||
|
// session.close();
|
||||||
|
// }
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// scope.inSession(
|
||||||
|
// session -> {
|
||||||
|
// assertTrue( session.getEntityManagerFactory().getCache().contains( Order.class, 1 ) );
|
||||||
|
// }
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// scope.inTransaction(
|
||||||
|
// session -> {
|
||||||
|
// session.getTransaction().begin();
|
||||||
|
// assertTrue( session.getEntityManagerFactory().getCache().contains( Order.class, 1 ) );
|
||||||
|
// session.createQuery( "delete Order" ).executeUpdate();
|
||||||
|
// session.getTransaction().commit();
|
||||||
|
// session.close();
|
||||||
|
// }
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// scope.inSession(
|
||||||
|
// session -> {
|
||||||
|
// assertFalse( session.getEntityManagerFactory().getCache().contains( Order.class, 1 ) );
|
||||||
|
// }
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cacheable.api;
|
package org.hibernate.orm.test.jpa.cacheable.api;
|
||||||
|
|
||||||
import javax.persistence.Cacheable;
|
import javax.persistence.Cacheable;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cacheable.cachemodes;
|
||||||
|
|
||||||
|
import javax.persistence.CacheRetrieveMode;
|
||||||
|
import javax.persistence.CacheStoreMode;
|
||||||
|
|
||||||
|
import org.hibernate.CacheMode;
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
@DomainModel(
|
||||||
|
annotatedClasses = { SimpleEntity.class }
|
||||||
|
)
|
||||||
|
@SessionFactory
|
||||||
|
public class SharedCacheModesTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEntityManagerCacheModes(SessionFactoryScope scope) {
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
// defaults...
|
||||||
|
assertEquals( CacheStoreMode.USE, session.getProperties().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheRetrieveMode.USE, session.getProperties().get( AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE ) );
|
||||||
|
assertEquals( CacheMode.NORMAL, session.getCacheMode() );
|
||||||
|
|
||||||
|
// overrides...
|
||||||
|
session.setProperty( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE, CacheStoreMode.REFRESH );
|
||||||
|
assertEquals( CacheStoreMode.REFRESH, session.getProperties().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheMode.REFRESH, session.getCacheMode() );
|
||||||
|
|
||||||
|
session.setProperty( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE, CacheStoreMode.BYPASS );
|
||||||
|
assertEquals( CacheStoreMode.BYPASS, session.getProperties().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheMode.GET, session.getCacheMode() );
|
||||||
|
|
||||||
|
session.setProperty( AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS );
|
||||||
|
assertEquals(CacheRetrieveMode.BYPASS, session.getProperties().get( AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE ) );
|
||||||
|
assertEquals( CacheMode.IGNORE, session.getCacheMode() );
|
||||||
|
|
||||||
|
session.setProperty( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE, CacheStoreMode.USE );
|
||||||
|
assertEquals( CacheStoreMode.USE, session.getProperties().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheMode.PUT, session.getCacheMode() );
|
||||||
|
|
||||||
|
session.setProperty( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE, CacheStoreMode.REFRESH );
|
||||||
|
assertEquals( CacheStoreMode.REFRESH, session.getProperties().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheMode.REFRESH, session.getCacheMode() );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testQueryCacheModes(SessionFactoryScope scope) {
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
org.hibernate.query.Query query = session.createQuery( "from SimpleEntity" );
|
||||||
|
|
||||||
|
query.setHint( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE, CacheStoreMode.USE );
|
||||||
|
assertEquals( CacheStoreMode.USE, query.getHints().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheMode.NORMAL, query.getCacheMode() );
|
||||||
|
|
||||||
|
query.setHint( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE, CacheStoreMode.BYPASS );
|
||||||
|
assertEquals( CacheStoreMode.BYPASS, query.getHints().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheMode.GET, query.getCacheMode() );
|
||||||
|
|
||||||
|
query.setHint( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE, CacheStoreMode.REFRESH );
|
||||||
|
assertEquals( CacheStoreMode.REFRESH, query.getHints().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheMode.REFRESH, query.getCacheMode() );
|
||||||
|
|
||||||
|
query.setHint( AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS );
|
||||||
|
assertEquals( CacheRetrieveMode.BYPASS, query.getHints().get( AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE ) );
|
||||||
|
assertEquals( CacheStoreMode.REFRESH, query.getHints().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheMode.REFRESH, query.getCacheMode() );
|
||||||
|
|
||||||
|
query.setHint( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE, CacheStoreMode.BYPASS );
|
||||||
|
assertEquals( CacheRetrieveMode.BYPASS, query.getHints().get( AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE ) );
|
||||||
|
assertEquals( CacheStoreMode.BYPASS, query.getHints().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheMode.IGNORE, query.getCacheMode() );
|
||||||
|
|
||||||
|
query.setHint( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE, CacheStoreMode.USE );
|
||||||
|
assertEquals( CacheRetrieveMode.BYPASS, query.getHints().get( AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE ) );
|
||||||
|
assertEquals( CacheStoreMode.USE, query.getHints().get( AvailableSettings.JPA_SHARED_CACHE_STORE_MODE ) );
|
||||||
|
assertEquals( CacheMode.PUT, query.getCacheMode() );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cacheable.cachemodes;
|
package org.hibernate.orm.test.jpa.cacheable.cachemodes;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
|
import org.hibernate.jpa.test.Cat;
|
||||||
|
import org.hibernate.jpa.test.Kitten;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.ServiceRegistry;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.Setting;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Sanne Grinovero
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@ServiceRegistry(
|
||||||
|
settings = {
|
||||||
|
@Setting(name = AvailableSettings.JPA_CALLBACKS_ENABLED, value = "false"),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@DomainModel(
|
||||||
|
annotatedClasses = {
|
||||||
|
Cat.class,
|
||||||
|
Kitten.class,
|
||||||
|
Plant.class,
|
||||||
|
Television.class,
|
||||||
|
RemoteControl.class,
|
||||||
|
Translation.class,
|
||||||
|
Rythm.class
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@SessionFactory
|
||||||
|
public class CallbacksDisabledTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCallbacksAreDisabled(SessionFactoryScope scope) throws Exception {
|
||||||
|
int id = scope.fromTransaction(
|
||||||
|
session -> {
|
||||||
|
Cat c = new Cat();
|
||||||
|
c.setName( "Kitty" );
|
||||||
|
c.setDateOfBirth( new Date( 90, 11, 15 ) );
|
||||||
|
session.persist( c );
|
||||||
|
return c.getId();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Cat _c = session.find( Cat.class, id );
|
||||||
|
assertTrue( _c.getAge() == 0 ); // With listeners enabled this would be false. Proven by org.hibernate.orm.test.jpa.callbacks.CallbacksTest.testCallbackMethod
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,290 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import org.hibernate.jpa.test.Cat;
|
||||||
|
import org.hibernate.jpa.test.Kitten;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.FailureExpected;
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@DomainModel(annotatedClasses = {
|
||||||
|
Cat.class,
|
||||||
|
Kitten.class,
|
||||||
|
Plant.class,
|
||||||
|
Television.class,
|
||||||
|
RemoteControl.class,
|
||||||
|
Rythm.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class CallbacksTest {
|
||||||
|
@Test
|
||||||
|
public void testCallbackMethod(SessionFactoryScope scope) {
|
||||||
|
int id = scope.fromTransaction(
|
||||||
|
session -> {
|
||||||
|
Cat c = new Cat();
|
||||||
|
c.setName( "Kitty" );
|
||||||
|
c.setDateOfBirth( new Date( 90, 11, 15 ) );
|
||||||
|
session.persist( c );
|
||||||
|
return c.getId();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Cat _c = session.find( Cat.class, id );
|
||||||
|
assertFalse( _c.getAge() == 0 );
|
||||||
|
_c.setName( "Tomcat" ); //update this entity
|
||||||
|
}
|
||||||
|
);
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Cat _c = session.find( Cat.class, id );
|
||||||
|
assertEquals( "Tomcat", _c.getName() );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEntityListener(SessionFactoryScope scope) {
|
||||||
|
final class PV {
|
||||||
|
PV(int version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
private int version;
|
||||||
|
private void set(int version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
private int get() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Cat c = new Cat();
|
||||||
|
c.setName( "Kitty" );
|
||||||
|
c.setLength( 12 );
|
||||||
|
c.setDateOfBirth( new Date( 90, 11, 15 ) );
|
||||||
|
PV previousVersion = new PV( c.getManualVersion() );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.persist( c )
|
||||||
|
);
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Cat _c = session.find( Cat.class, c.getId() );
|
||||||
|
assertNotNull( _c.getLastUpdate() );
|
||||||
|
assertTrue( previousVersion.get() < _c.getManualVersion() );
|
||||||
|
assertEquals( 12, _c.getLength() );
|
||||||
|
previousVersion.set( _c.getManualVersion() );
|
||||||
|
_c.setName( "new name" );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Cat _c = session.find( Cat.class, c.getId() );
|
||||||
|
assertTrue( previousVersion.get() < _c.getManualVersion() );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPostPersist(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Cat c = new Cat();
|
||||||
|
c.setLength( 23 );
|
||||||
|
c.setAge( 2 );
|
||||||
|
c.setName( "Beetle" );
|
||||||
|
c.setDateOfBirth( new Date() );
|
||||||
|
session.persist( c );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
List ids = Cat.getIdList();
|
||||||
|
Object id = Cat.getIdList().get( ids.size() - 1 );
|
||||||
|
assertNotNull( id );
|
||||||
|
}
|
||||||
|
|
||||||
|
//Not a test since the spec did not make the proper change on listeners
|
||||||
|
public void listenerAnnotation(SessionFactoryScope scope) {
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
Translation tl = new Translation();
|
||||||
|
session.getTransaction().begin();
|
||||||
|
tl.setInto( "France" );
|
||||||
|
session.persist( tl );
|
||||||
|
tl = new Translation();
|
||||||
|
tl.setInto( "Bimboland" );
|
||||||
|
try {
|
||||||
|
session.persist( tl );
|
||||||
|
session.flush();
|
||||||
|
fail( "Annotations annotated by a listener not used" );
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e) {
|
||||||
|
//success
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
session.getTransaction().rollback();
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPrePersistOnCascade(SessionFactoryScope scope) {
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
session.getTransaction().begin();
|
||||||
|
Television tv = new Television();
|
||||||
|
RemoteControl rc = new RemoteControl();
|
||||||
|
session.persist( tv );
|
||||||
|
session.flush();
|
||||||
|
tv.setControl( rc );
|
||||||
|
tv.init();
|
||||||
|
session.flush();
|
||||||
|
assertNotNull( rc.getCreationDate() );
|
||||||
|
session.getTransaction().rollback();
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCallBackListenersHierarchy(SessionFactoryScope scope) {
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
session.getTransaction().begin();
|
||||||
|
Television tv = new Television();
|
||||||
|
session.persist( tv );
|
||||||
|
tv.setName( "Myaio" );
|
||||||
|
tv.init();
|
||||||
|
session.flush();
|
||||||
|
assertEquals( 1, tv.counter );
|
||||||
|
session.getTransaction().rollback();
|
||||||
|
session.close();
|
||||||
|
assertEquals( 5, tv.communication );
|
||||||
|
assertTrue( tv.isLast );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testException(SessionFactoryScope scope) {
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
session.getTransaction().begin();
|
||||||
|
Rythm r = new Rythm();
|
||||||
|
try {
|
||||||
|
session.persist( r );
|
||||||
|
session.flush();
|
||||||
|
fail( "should have raised an ArythmeticException:" );
|
||||||
|
}
|
||||||
|
catch (ArithmeticException e) {
|
||||||
|
//success
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
fail( "should have raised an ArythmeticException:" + e.getClass() );
|
||||||
|
}
|
||||||
|
|
||||||
|
session.getTransaction().rollback();
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIdNullSetByPrePersist(SessionFactoryScope scope) {
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
Plant plant = new Plant();
|
||||||
|
plant.setName( "Origuna plantula gigantic" );
|
||||||
|
session.getTransaction().begin();
|
||||||
|
session.persist( plant );
|
||||||
|
session.flush();
|
||||||
|
session.getTransaction().rollback();
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@FailureExpected(reason = "collection change does not trigger an event", jiraKey = "EJB-288")
|
||||||
|
public void testPostUpdateCollection(SessionFactoryScope scope) {
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
// create a cat
|
||||||
|
Cat cat = new Cat();
|
||||||
|
session.getTransaction().begin();
|
||||||
|
cat.setLength( 23 );
|
||||||
|
cat.setAge( 2 );
|
||||||
|
cat.setName( "Beetle" );
|
||||||
|
cat.setDateOfBirth( new Date() );
|
||||||
|
session.persist( cat );
|
||||||
|
session.getTransaction().commit();
|
||||||
|
|
||||||
|
// assert it is persisted
|
||||||
|
List ids = Cat.getIdList();
|
||||||
|
Object id = Cat.getIdList().get( ids.size() - 1 );
|
||||||
|
assertNotNull( id );
|
||||||
|
|
||||||
|
// add a kitten to the cat - triggers PostCollectionRecreateEvent
|
||||||
|
int postVersion = Cat.postVersion;
|
||||||
|
session.getTransaction().begin();
|
||||||
|
Kitten kitty = new Kitten();
|
||||||
|
kitty.setName( "kitty" );
|
||||||
|
List kittens = new ArrayList<Kitten>();
|
||||||
|
kittens.add( kitty );
|
||||||
|
cat.setKittens( kittens );
|
||||||
|
session.getTransaction().commit();
|
||||||
|
assertEquals( postVersion + 1, Cat.postVersion, "Post version should have been incremented." );
|
||||||
|
|
||||||
|
// add another kitten - triggers PostCollectionUpdateEvent.
|
||||||
|
postVersion = Cat.postVersion;
|
||||||
|
session.getTransaction().begin();
|
||||||
|
Kitten tom = new Kitten();
|
||||||
|
tom.setName( "Tom" );
|
||||||
|
cat.getKittens().add( tom );
|
||||||
|
session.getTransaction().commit();
|
||||||
|
assertEquals( postVersion + 1, Cat.postVersion, "Post version should have been incremented." );
|
||||||
|
|
||||||
|
// delete a kitty - triggers PostCollectionUpdateEvent
|
||||||
|
postVersion = Cat.postVersion;
|
||||||
|
session.getTransaction().begin();
|
||||||
|
cat.getKittens().remove( tom );
|
||||||
|
session.getTransaction().commit();
|
||||||
|
assertEquals( postVersion + 1, Cat.postVersion, "Post version should have been incremented." );
|
||||||
|
|
||||||
|
// delete and recreate kittens - triggers PostCollectionRemoveEvent and PostCollectionRecreateEvent)
|
||||||
|
postVersion = Cat.postVersion;
|
||||||
|
session.getTransaction().begin();
|
||||||
|
cat.setKittens( new ArrayList<Kitten>() );
|
||||||
|
session.getTransaction().commit();
|
||||||
|
assertEquals( postVersion + 2, Cat.postVersion, "Post version should have been incremented." );
|
||||||
|
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import javax.persistence.EntityListeners;
|
import javax.persistence.EntityListeners;
|
||||||
import javax.persistence.MappedSuperclass;
|
import javax.persistence.MappedSuperclass;
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.ElementType;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
|
@ -6,12 +6,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.persistence.PrePersist;
|
import javax.persistence.PrePersist;
|
||||||
import javax.persistence.PreUpdate;
|
import javax.persistence.PreUpdate;
|
||||||
|
|
||||||
|
import org.hibernate.orm.test.jpa.callbacks.Translation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Emmanuel Bernard
|
* @author Emmanuel Bernard
|
||||||
*/
|
*/
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import javax.persistence.PrePersist;
|
import javax.persistence.PrePersist;
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import javax.persistence.PreUpdate;
|
import javax.persistence.PreUpdate;
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import javax.persistence.PreUpdate;
|
import javax.persistence.PreUpdate;
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
import javax.persistence.PrePersist;
|
import javax.persistence.PrePersist;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -20,56 +20,60 @@ import javax.persistence.ManyToOne;
|
||||||
import javax.persistence.OneToMany;
|
import javax.persistence.OneToMany;
|
||||||
import javax.persistence.PreUpdate;
|
import javax.persistence.PreUpdate;
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.junit.Test;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
@TestForIssue(jiraKey = "HHH-13466")
|
@TestForIssue(jiraKey = "HHH-13466")
|
||||||
public class PreUpdateNewBidirectionalBagTest extends BaseEntityManagerFunctionalTestCase {
|
@DomainModel(annotatedClasses = {
|
||||||
|
PreUpdateNewBidirectionalBagTest.Person.class,
|
||||||
@Override
|
PreUpdateNewBidirectionalBagTest.Tag.class
|
||||||
protected Class<?>[] getAnnotatedClasses() {
|
})
|
||||||
return new Class<?>[] { Person.class, Tag.class };
|
@SessionFactory
|
||||||
}
|
public class PreUpdateNewBidirectionalBagTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPreUpdateModifications() {
|
public void testPreUpdateModifications(SessionFactoryScope scope) {
|
||||||
Person person = new Person();
|
Person person = new Person();
|
||||||
person.id = 1;
|
person.id = 1;
|
||||||
|
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
scope.inTransaction(
|
||||||
entityManager.persist( person );
|
session -> session.persist( person )
|
||||||
} );
|
);
|
||||||
|
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
scope.inTransaction(
|
||||||
Person p = entityManager.find( Person.class, person.id );
|
session -> {
|
||||||
assertNotNull( p );
|
Person p = session.find( Person.class, person.id );
|
||||||
final Tag tag = new Tag();
|
assertNotNull( p );
|
||||||
tag.id = 2;
|
final Tag tag = new Tag();
|
||||||
tag.description = "description";
|
tag.id = 2;
|
||||||
tag.person = p;
|
tag.description = "description";
|
||||||
final Set<Tag> tags = new HashSet<Tag>();
|
tag.person = p;
|
||||||
tags.add( tag );
|
final Set<Tag> tags = new HashSet<Tag>();
|
||||||
p.tags = tags;
|
tags.add( tag );
|
||||||
entityManager.merge( p );
|
p.tags = tags;
|
||||||
} );
|
session.merge( p );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
scope.inTransaction(
|
||||||
Person p = entityManager.find( Person.class, person.id );
|
session -> {
|
||||||
assertEquals( 1, p.tags.size() );
|
Person p = session.find( Person.class, person.id );
|
||||||
assertEquals( "description", p.tags.iterator().next().description );
|
assertEquals( 1, p.tags.size() );
|
||||||
assertNotNull( p.getLastUpdatedAt() );
|
assertEquals( "description", p.tags.iterator().next().description );
|
||||||
} );
|
assertNotNull( p.getLastUpdatedAt() );
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity(name = "Person")
|
@Entity(name = "Person")
|
||||||
@EntityListeners( PersonListener.class )
|
@EntityListeners( PersonListener.class )
|
||||||
private static class Person {
|
public static class Person {
|
||||||
@Id
|
@Id
|
||||||
private int id;
|
private int id;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -19,55 +19,59 @@ import javax.persistence.Id;
|
||||||
import javax.persistence.OneToMany;
|
import javax.persistence.OneToMany;
|
||||||
import javax.persistence.PreUpdate;
|
import javax.persistence.PreUpdate;
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.junit.Test;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
@TestForIssue(jiraKey = "HHH-13466")
|
@TestForIssue(jiraKey = "HHH-13466")
|
||||||
public class PreUpdateNewUnidirectionalBagTest extends BaseEntityManagerFunctionalTestCase {
|
@DomainModel(annotatedClasses = {
|
||||||
|
PreUpdateNewUnidirectionalBagTest.Person.class,
|
||||||
@Override
|
PreUpdateNewUnidirectionalBagTest.Tag.class
|
||||||
protected Class<?>[] getAnnotatedClasses() {
|
})
|
||||||
return new Class<?>[] { Person.class, Tag.class };
|
@SessionFactory
|
||||||
}
|
public class PreUpdateNewUnidirectionalBagTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPreUpdateModifications() {
|
public void testPreUpdateModifications(SessionFactoryScope scope) {
|
||||||
Person person = new Person();
|
Person person = new Person();
|
||||||
person.id = 1;
|
person.id = 1;
|
||||||
|
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
scope.inTransaction(
|
||||||
entityManager.persist( person );
|
session -> session.persist( person )
|
||||||
} );
|
);
|
||||||
|
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
scope.inTransaction(
|
||||||
Person p = entityManager.find( Person.class, person.id );
|
session -> {
|
||||||
assertNotNull( p );
|
Person p = session.find( Person.class, person.id );
|
||||||
final Tag tag = new Tag();
|
assertNotNull( p );
|
||||||
tag.id = 2;
|
final Tag tag = new Tag();
|
||||||
tag.description = "description";
|
tag.id = 2;
|
||||||
final Set<Tag> tags = new HashSet<Tag>();
|
tag.description = "description";
|
||||||
tags.add( tag );
|
final Set<Tag> tags = new HashSet<Tag>();
|
||||||
p.tags = tags;
|
tags.add( tag );
|
||||||
entityManager.merge( p );
|
p.tags = tags;
|
||||||
} );
|
session.merge( p );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
scope.inTransaction(
|
||||||
Person p = entityManager.find( Person.class, person.id );
|
session -> {
|
||||||
assertEquals( 1, p.tags.size() );
|
Person p = session.find( Person.class, person.id );
|
||||||
assertEquals( "description", p.tags.iterator().next().description );
|
assertEquals( 1, p.tags.size() );
|
||||||
assertNotNull( p.getLastUpdatedAt() );
|
assertEquals( "description", p.tags.iterator().next().description );
|
||||||
} );
|
assertNotNull( p.getLastUpdatedAt() );
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity(name = "Person")
|
@Entity(name = "Person")
|
||||||
@EntityListeners( PersonListener.class )
|
@EntityListeners( PersonListener.class )
|
||||||
private static class Person {
|
public static class Person {
|
||||||
@Id
|
@Id
|
||||||
private int id;
|
private int id;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -23,56 +23,61 @@ import javax.persistence.PreUpdate;
|
||||||
import org.hibernate.annotations.CollectionId;
|
import org.hibernate.annotations.CollectionId;
|
||||||
import org.hibernate.annotations.GenericGenerator;
|
import org.hibernate.annotations.GenericGenerator;
|
||||||
import org.hibernate.annotations.Type;
|
import org.hibernate.annotations.Type;
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.junit.Test;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
@TestForIssue(jiraKey = "HHH-13466")
|
@TestForIssue(jiraKey = "HHH-13466")
|
||||||
public class PreUpdateNewUnidirectionalIdBagTest extends BaseEntityManagerFunctionalTestCase {
|
@DomainModel(annotatedClasses = {
|
||||||
|
PreUpdateNewUnidirectionalIdBagTest.Person.class,
|
||||||
@Override
|
PreUpdateNewUnidirectionalIdBagTest.Tag.class
|
||||||
protected Class<?>[] getAnnotatedClasses() {
|
})
|
||||||
return new Class<?>[] { Person.class, Tag.class };
|
@SessionFactory
|
||||||
}
|
public class PreUpdateNewUnidirectionalIdBagTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPreUpdateModifications() {
|
public void testPreUpdateModifications(SessionFactoryScope scope) {
|
||||||
Person person = new Person();
|
Person person = new Person();
|
||||||
person.id = 1;
|
person.id = 1;
|
||||||
|
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
scope.inTransaction(
|
||||||
entityManager.persist( person );
|
session -> session.persist( person )
|
||||||
} );
|
);
|
||||||
|
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
scope.inTransaction(
|
||||||
Person p = entityManager.find( Person.class, person.id );
|
session -> {
|
||||||
assertNotNull( p );
|
Person p = session.find( Person.class, person.id );
|
||||||
final Tag tag = new Tag();
|
assertNotNull( p );
|
||||||
tag.id = 2;
|
final Tag tag = new Tag();
|
||||||
tag.description = "description";
|
tag.id = 2;
|
||||||
final Set<Tag> tags = new HashSet<Tag>();
|
tag.description = "description";
|
||||||
tags.add( tag );
|
final Set<Tag> tags = new HashSet<Tag>();
|
||||||
p.tags = tags;
|
tags.add( tag );
|
||||||
entityManager.merge( p );
|
p.tags = tags;
|
||||||
} );
|
session.merge( p );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
scope.inTransaction(
|
||||||
Person p = entityManager.find( Person.class, person.id );
|
session -> {
|
||||||
assertEquals( 1, p.tags.size() );
|
Person p = session.find( Person.class, person.id );
|
||||||
assertEquals( "description", p.tags.iterator().next().description );
|
assertEquals( 1, p.tags.size() );
|
||||||
assertNotNull( p.getLastUpdatedAt() );
|
assertEquals( "description", p.tags.iterator().next().description );
|
||||||
} );
|
assertNotNull( p.getLastUpdatedAt() );
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity(name = "Person")
|
@Entity(name = "Person")
|
||||||
@EntityListeners( PersonListener.class )
|
@EntityListeners( PersonListener.class )
|
||||||
@GenericGenerator(name="increment", strategy = "increment")
|
@GenericGenerator(name="increment", strategy = "increment")
|
||||||
private static class Person {
|
public static class Person {
|
||||||
@Id
|
@Id
|
||||||
private int id;
|
private int id;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.persistence.Basic;
|
import javax.persistence.Basic;
|
||||||
|
@ -22,9 +22,9 @@ import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
@RunWith(BytecodeEnhancerRunner.class)
|
@RunWith(BytecodeEnhancerRunner.class)
|
||||||
public class PrivateConstructorEnhancerTest extends BaseNonConfigCoreFunctionalTestCase {
|
public class PrivateConstructorEnhancerTest extends BaseNonConfigCoreFunctionalTestCase {
|
|
@ -4,13 +4,11 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
|
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.EntityTransaction;
|
|
||||||
import javax.persistence.FetchType;
|
import javax.persistence.FetchType;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.GenerationType;
|
import javax.persistence.GenerationType;
|
||||||
|
@ -20,24 +18,31 @@ import javax.persistence.ManyToOne;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
import org.hibernate.proxy.ProxyFactory;
|
import org.hibernate.proxy.ProxyFactory;
|
||||||
import org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyFactory;
|
import org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyFactory;
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.hibernate.testing.logger.LoggerInspectionRule;
|
import org.hibernate.testing.logger.LoggerInspectionRule;
|
||||||
import org.hibernate.testing.logger.Triggerable;
|
import org.hibernate.testing.logger.Triggerable;
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
import org.hibernate.testing.util.ExceptionUtil;
|
import org.hibernate.testing.util.ExceptionUtil;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
@TestForIssue(jiraKey = "HHH-13020")
|
@TestForIssue(jiraKey = "HHH-13020")
|
||||||
public class PrivateConstructorTest extends BaseEntityManagerFunctionalTestCase {
|
@DomainModel(annotatedClasses = {
|
||||||
|
PrivateConstructorTest.Parent.class,
|
||||||
|
PrivateConstructorTest.Child.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class PrivateConstructorTest {
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public LoggerInspectionRule logInspection = new LoggerInspectionRule( Logger.getMessageLogger(
|
public LoggerInspectionRule logInspection = new LoggerInspectionRule( Logger.getMessageLogger(
|
||||||
|
@ -46,56 +51,30 @@ public class PrivateConstructorTest extends BaseEntityManagerFunctionalTestCase
|
||||||
.getName()
|
.getName()
|
||||||
) );
|
) );
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Class<?>[] getAnnotatedClasses() {
|
|
||||||
return new Class<?>[] {
|
|
||||||
Parent.class,
|
|
||||||
Child.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void test(SessionFactoryScope scope) {
|
||||||
Child child = new Child();
|
Child child = new Child();
|
||||||
|
|
||||||
EntityManager entityManager = null;
|
scope.inTransaction(
|
||||||
EntityTransaction txn = null;
|
session -> session.persist( child )
|
||||||
try {
|
);
|
||||||
entityManager = createEntityManager();
|
|
||||||
txn = entityManager.getTransaction();
|
|
||||||
txn.begin();
|
|
||||||
entityManager.persist( child );
|
|
||||||
txn.commit();
|
|
||||||
|
|
||||||
entityManager.clear();
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
Integer childId = child.getId();
|
Triggerable triggerable = logInspection.watchForLogMessages( "HHH000143:" );
|
||||||
|
Child childReference = session.getReference( Child.class, child.getId() );
|
||||||
Triggerable triggerable = logInspection.watchForLogMessages( "HHH000143:" );
|
try {
|
||||||
|
assertEquals( child.getParent().getName(), childReference.getParent().getName() );
|
||||||
Child childReference = entityManager.getReference( Child.class, childId );
|
}
|
||||||
try {
|
catch (Exception expected) {
|
||||||
assertEquals( child.getParent().getName(), childReference.getParent().getName() );
|
assertEquals( NoSuchMethodException.class, ExceptionUtil.rootCause( expected ).getClass() );
|
||||||
}
|
assertTrue( expected.getMessage().contains(
|
||||||
catch (Exception expected) {
|
"Bytecode enhancement failed because no public, protected or package-private default constructor was found for entity"
|
||||||
assertEquals( NoSuchMethodException.class, ExceptionUtil.rootCause( expected ).getClass() );
|
) );
|
||||||
assertTrue( expected.getMessage().contains(
|
}
|
||||||
"Bytecode enhancement failed because no public, protected or package-private default constructor was found for entity"
|
assertTrue( triggerable.wasTriggered() );
|
||||||
) );
|
}
|
||||||
}
|
);
|
||||||
assertTrue( triggerable.wasTriggered() );
|
|
||||||
}
|
|
||||||
catch (Throwable e) {
|
|
||||||
if ( txn != null && txn.isActive() ) {
|
|
||||||
txn.rollback();
|
|
||||||
}
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if ( entityManager != null ) {
|
|
||||||
entityManager.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Class<? extends ProxyFactory> proxyFactoryClass() {
|
private static Class<? extends ProxyFactory> proxyFactoryClass() {
|
|
@ -4,68 +4,47 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
|
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.EntityTransaction;
|
|
||||||
import javax.persistence.FetchType;
|
import javax.persistence.FetchType;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.GenerationType;
|
import javax.persistence.GenerationType;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
import javax.persistence.ManyToOne;
|
import javax.persistence.ManyToOne;
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.junit.Test;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
@TestForIssue( jiraKey = "HHH-13020" )
|
@TestForIssue( jiraKey = "HHH-13020" )
|
||||||
public class ProtectedConstructorTest extends BaseEntityManagerFunctionalTestCase {
|
@DomainModel(annotatedClasses = {
|
||||||
|
ProtectedConstructorTest.Parent.class,
|
||||||
@Override
|
ProtectedConstructorTest.Child.class
|
||||||
protected Class<?>[] getAnnotatedClasses() {
|
})
|
||||||
return new Class<?>[] {
|
@SessionFactory
|
||||||
Parent.class,
|
public class ProtectedConstructorTest {
|
||||||
Child.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void test(SessionFactoryScope scope) {
|
||||||
Child child = new Child();
|
Child child = new Child();
|
||||||
|
|
||||||
EntityManager entityManager = null;
|
scope.inTransaction(
|
||||||
EntityTransaction txn = null;
|
session -> session.persist( child )
|
||||||
try {
|
);
|
||||||
entityManager = createEntityManager();
|
|
||||||
txn = entityManager.getTransaction();
|
|
||||||
txn.begin();
|
|
||||||
entityManager.persist( child );
|
|
||||||
txn.commit();
|
|
||||||
|
|
||||||
entityManager.clear();
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
Integer childId = child.getId();
|
Child childReference = session.getReference( Child.class, child.getId() );
|
||||||
|
assertEquals( child.getParent().getName(), childReference.getParent().getName() );
|
||||||
Child childReference = entityManager.getReference( Child.class, childId );
|
}
|
||||||
assertEquals( child.getParent().getName(), childReference.getParent().getName() );
|
);
|
||||||
}
|
|
||||||
catch (Throwable e) {
|
|
||||||
if ( txn != null && txn.isActive() ) {
|
|
||||||
txn.rollback();
|
|
||||||
}
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if ( entityManager != null ) {
|
|
||||||
entityManager.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity(name = "Parent")
|
@Entity(name = "Parent")
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import javax.persistence.Basic;
|
import javax.persistence.Basic;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.EntityListeners;
|
import javax.persistence.EntityListeners;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.EntityListeners;
|
import javax.persistence.EntityListeners;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.callbacks;
|
package org.hibernate.orm.test.jpa.callbacks;
|
||||||
import javax.persistence.EntityListeners;
|
import javax.persistence.EntityListeners;
|
||||||
import javax.persistence.ExcludeSuperclassListeners;
|
import javax.persistence.ExcludeSuperclassListeners;
|
||||||
import javax.persistence.MappedSuperclass;
|
import javax.persistence.MappedSuperclass;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.callbacks.hbmxml;
|
package org.hibernate.orm.test.jpa.callbacks.hbmxml;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.callbacks.hbmxml;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Felix Feisst (feisst dot felix at gmail dot com)
|
||||||
|
*/
|
||||||
|
@DomainModel(
|
||||||
|
xmlMappings = "org/hibernate/orm/test/jpa/callbacks/hbmxml/ClassMappedMoreThanOnce.hbm.xml"
|
||||||
|
)
|
||||||
|
@SessionFactory
|
||||||
|
public class MappingClassMoreThanOnceTest {
|
||||||
|
/**
|
||||||
|
* Tests that an entity manager can be created when a class is mapped more than once.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
@TestForIssue(jiraKey = "HHH-8775")
|
||||||
|
public void testBootstrapWithClassMappedMOreThanOnce(SessionFactoryScope scope) {
|
||||||
|
|
||||||
|
SessionFactoryImplementor sfi = null;
|
||||||
|
try {
|
||||||
|
sfi = scope.getSessionFactory();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if ( sfi != null ) {
|
||||||
|
try {
|
||||||
|
sfi.close();
|
||||||
|
}
|
||||||
|
catch (Exception ignore) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.callbacks.xml;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
@DomainModel(
|
||||||
|
xmlMappings = "org/hibernate/orm/test/jpa/callbacks/xml/MyEntity.orm.xml"
|
||||||
|
)
|
||||||
|
@SessionFactory
|
||||||
|
public class EntityListenerViaXmlTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue(jiraKey = "HHH-9771")
|
||||||
|
public void testUsage(SessionFactoryScope scope) {
|
||||||
|
JournalingListener.reset();
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.persist( new MyEntity( 1, "steve" ) )
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals( 1, JournalingListener.getPrePersistCount() );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.createQuery( "delete MyEntity" ).executeUpdate()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.callbacks.xml;
|
package org.hibernate.orm.test.jpa.callbacks.xml;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An entity listener that keeps a journal of calls
|
* An entity listener that keeps a journal of calls
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.callbacks.xml;
|
package org.hibernate.orm.test.jpa.callbacks.xml;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Max Rydahl Andersen
|
||||||
|
*/
|
||||||
|
@DomainModel(annotatedClasses = {
|
||||||
|
Teacher.class,
|
||||||
|
Student.class,
|
||||||
|
Song.class,
|
||||||
|
Author.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class CascadeTest {
|
||||||
|
@Test
|
||||||
|
public void testCascade(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Teacher teacher = new Teacher();
|
||||||
|
Student student = new Student();
|
||||||
|
|
||||||
|
teacher.setFavoriteStudent( student );
|
||||||
|
student.setFavoriteTeacher( teacher );
|
||||||
|
|
||||||
|
teacher.getStudents().add( student );
|
||||||
|
student.setPrimaryTeacher( teacher );
|
||||||
|
|
||||||
|
session.persist( teacher );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Teacher foundTeacher = (Teacher) session.createQuery( "select t from Teacher as t" )
|
||||||
|
.getSingleResult();
|
||||||
|
|
||||||
|
System.out.println( foundTeacher );
|
||||||
|
System.out.println( foundTeacher.getFavoriteStudent() );
|
||||||
|
|
||||||
|
for ( Student fstudent : foundTeacher.getStudents() ) {
|
||||||
|
System.out.println( fstudent );
|
||||||
|
System.out.println( fstudent.getFavoriteTeacher() );
|
||||||
|
System.out.println( fstudent.getPrimaryTeacher() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNoCascadeAndMerge(SessionFactoryScope scope) {
|
||||||
|
Song s1 = new Song();
|
||||||
|
Author a1 = new Author();
|
||||||
|
s1.setAuthor( a1 );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
session.persist( a1 );
|
||||||
|
session.persist( s1 );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
Song s2 = scope.fromSession(
|
||||||
|
session -> session.find( Song.class, s1.getId() )
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.merge( s2 )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutput;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import org.hibernate.Hibernate;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@DomainModel(annotatedClasses = {
|
||||||
|
Troop.class,
|
||||||
|
Soldier.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class DeleteOrphanTest {
|
||||||
|
@Test
|
||||||
|
public void testDeleteOrphan(SessionFactoryScope scope) throws Exception {
|
||||||
|
Troop disney = new Troop();
|
||||||
|
Soldier mickey = new Soldier();
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
disney.setName( "Disney" );
|
||||||
|
mickey.setName( "Mickey" );
|
||||||
|
disney.addSoldier( mickey );
|
||||||
|
session.persist( disney );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
Troop troop2 = scope.fromTransaction(
|
||||||
|
session -> {
|
||||||
|
Troop troop = session.find( Troop.class, disney.getId() );
|
||||||
|
Hibernate.initialize( troop.getSoldiers() );
|
||||||
|
return troop;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
Soldier soldier = troop2.getSoldiers().iterator().next();
|
||||||
|
troop2.getSoldiers().remove( soldier );
|
||||||
|
Troop troop3 = (Troop) deserialize( serialize( troop2 ) );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.merge( troop3 )
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Soldier _soldier = session.find( Soldier.class, mickey.getId() );
|
||||||
|
assertNull( _soldier, "delete-orphan should work" );
|
||||||
|
Troop _troop = session.find( Troop.class, disney.getId() );
|
||||||
|
session.remove( _troop );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] serialize(Object object) throws IOException {
|
||||||
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
|
ObjectOutput out = new ObjectOutputStream( stream );
|
||||||
|
out.writeObject( object );
|
||||||
|
out.close();
|
||||||
|
byte[] serialized = stream.toByteArray();
|
||||||
|
stream.close();
|
||||||
|
return serialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object deserialize(byte[] serialized) throws IOException, ClassNotFoundException {
|
||||||
|
ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
|
||||||
|
ObjectInputStream in = new ObjectInputStream( byteIn );
|
||||||
|
Object result = in.readObject();
|
||||||
|
in.close();
|
||||||
|
byteIn.close();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
import javax.persistence.OneToMany;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
|
||||||
|
import static javax.persistence.CascadeType.DETACH;
|
||||||
|
import static javax.persistence.CascadeType.REMOVE;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@DomainModel(annotatedClasses = {
|
||||||
|
DetachAndContainsTest.Mouth.class,
|
||||||
|
DetachAndContainsTest.Tooth.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class DetachAndContainsTest {
|
||||||
|
@Test
|
||||||
|
public void testDetach(SessionFactoryScope scope) {
|
||||||
|
Tooth tooth = new Tooth();
|
||||||
|
Mouth mouth = new Mouth();
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
session.persist( mouth );
|
||||||
|
session.persist( tooth );
|
||||||
|
tooth.mouth = mouth;
|
||||||
|
mouth.teeth = new ArrayList<>();
|
||||||
|
mouth.teeth.add( tooth );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Mouth _mouth = session.find( Mouth.class, mouth.id );
|
||||||
|
assertNotNull( _mouth );
|
||||||
|
assertEquals( 1, _mouth.teeth.size() );
|
||||||
|
Tooth _tooth = _mouth.teeth.iterator().next();
|
||||||
|
session.detach( _mouth );
|
||||||
|
assertFalse( session.contains( _tooth ) );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.remove( session.find( Mouth.class, mouth.id ) )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "mouth")
|
||||||
|
public static class Mouth {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
public Integer id;
|
||||||
|
@OneToMany(mappedBy = "mouth", cascade = { DETACH, REMOVE } )
|
||||||
|
public Collection<Tooth> teeth;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "tooth")
|
||||||
|
public static class Tooth {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
public Integer id;
|
||||||
|
public String type;
|
||||||
|
@ManyToOne
|
||||||
|
public Mouth mouth;
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
|
@ -0,0 +1,152 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import org.hibernate.Hibernate;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@DomainModel(annotatedClasses = {
|
||||||
|
Troop.class,
|
||||||
|
Soldier.class,
|
||||||
|
Conference.class,
|
||||||
|
ExtractionDocument.class,
|
||||||
|
ExtractionDocumentInfo.class,
|
||||||
|
Parent.class,
|
||||||
|
Son.class,
|
||||||
|
Grandson.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class FetchTest {
|
||||||
|
@Test
|
||||||
|
public void testCascadeAndFetchCollection(SessionFactoryScope scope) {
|
||||||
|
Troop disney = new Troop();
|
||||||
|
Soldier mickey = new Soldier();
|
||||||
|
disney.setName( "Disney" );
|
||||||
|
mickey.setName( "Mickey" );
|
||||||
|
disney.addSoldier( mickey );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.persist( disney )
|
||||||
|
);
|
||||||
|
|
||||||
|
Troop troop2 = scope.fromTransaction(
|
||||||
|
session -> {
|
||||||
|
Troop troop = session.find( Troop.class, disney.getId() );
|
||||||
|
assertFalse( Hibernate.isInitialized( troop.getSoldiers() ) );
|
||||||
|
return troop;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assertFalse( Hibernate.isInitialized( troop2.getSoldiers() ) );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Troop troop = session.find( Troop.class, disney.getId() );
|
||||||
|
session.remove( troop );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCascadeAndFetchEntity(SessionFactoryScope scope) {
|
||||||
|
Troop disney = new Troop();
|
||||||
|
Soldier mickey = new Soldier();
|
||||||
|
disney.setName( "Disney" );
|
||||||
|
mickey.setName( "Mickey" );
|
||||||
|
disney.addSoldier( mickey );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.persist( disney )
|
||||||
|
);
|
||||||
|
|
||||||
|
Soldier soldier2 = scope.fromTransaction(
|
||||||
|
session -> {
|
||||||
|
Soldier soldier = session.find( Soldier.class, mickey.getId() );
|
||||||
|
assertFalse( Hibernate.isInitialized( soldier.getTroop() ) );
|
||||||
|
return soldier;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assertFalse( Hibernate.isInitialized( soldier2.getTroop() ) );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Troop troop = session.find( Troop.class, disney.getId() );
|
||||||
|
session.remove( troop );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTwoLevelDeepPersist(SessionFactoryScope scope) {
|
||||||
|
Conference jbwBarcelona = new Conference();
|
||||||
|
jbwBarcelona.setDate( new Date() );
|
||||||
|
ExtractionDocumentInfo info = new ExtractionDocumentInfo();
|
||||||
|
info.setConference( jbwBarcelona );
|
||||||
|
jbwBarcelona.setExtractionDocument( info );
|
||||||
|
info.setLastModified( new Date() );
|
||||||
|
ExtractionDocument doc = new ExtractionDocument();
|
||||||
|
doc.setDocumentInfo( info );
|
||||||
|
info.setDocuments( new ArrayList<ExtractionDocument>() );
|
||||||
|
info.getDocuments().add( doc );
|
||||||
|
doc.setBody( new byte[]{'c', 'f'} );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.persist( jbwBarcelona )
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
session.getTransaction().begin();
|
||||||
|
Conference _jbwBarcelona = session.find( Conference.class, jbwBarcelona.getId() );
|
||||||
|
assertTrue( Hibernate.isInitialized( _jbwBarcelona ) );
|
||||||
|
assertTrue( Hibernate.isInitialized( _jbwBarcelona.getExtractionDocument() ) );
|
||||||
|
assertFalse( Hibernate.isInitialized( _jbwBarcelona.getExtractionDocument().getDocuments() ) );
|
||||||
|
session.flush();
|
||||||
|
assertTrue( Hibernate.isInitialized( _jbwBarcelona ) );
|
||||||
|
assertTrue( Hibernate.isInitialized( _jbwBarcelona.getExtractionDocument() ) );
|
||||||
|
assertFalse( Hibernate.isInitialized( _jbwBarcelona.getExtractionDocument().getDocuments() ) );
|
||||||
|
session.remove( _jbwBarcelona );
|
||||||
|
session.getTransaction().commit();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTwoLevelDeepPersistOnManyToOne(SessionFactoryScope scope) {
|
||||||
|
Grandson gs = new Grandson();
|
||||||
|
gs.setParent( new Son() );
|
||||||
|
gs.getParent().setParent( new Parent() );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.persist( gs )
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
session.getTransaction().begin();
|
||||||
|
Grandson _gs = session.find( Grandson.class, gs.getId() );
|
||||||
|
session.flush();
|
||||||
|
assertTrue( Hibernate.isInitialized( _gs.getParent() ) );
|
||||||
|
assertFalse( Hibernate.isInitialized( _gs.getParent().getParent() ) );
|
||||||
|
session.remove( _gs );
|
||||||
|
session.getTransaction().commit();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
@DomainModel(annotatedClasses = {
|
||||||
|
Troop2.class,
|
||||||
|
Soldier2.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class FetchTest2 {
|
||||||
|
@Test
|
||||||
|
public void testProxyTransientStuff(SessionFactoryScope scope) {
|
||||||
|
Troop2 disney = new Troop2();
|
||||||
|
disney.setName( "Disney" );
|
||||||
|
|
||||||
|
Soldier2 mickey = new Soldier2();
|
||||||
|
mickey.setName( "Mickey" );
|
||||||
|
mickey.setTroop( disney );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
session.persist( disney );
|
||||||
|
session.persist( mickey );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Soldier2 _soldier = session.find( Soldier2.class, mickey.getId() );
|
||||||
|
_soldier.getTroop().getId();
|
||||||
|
try {
|
||||||
|
session.flush();
|
||||||
|
}
|
||||||
|
catch (IllegalStateException e) {
|
||||||
|
fail( "Should not raise an exception" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
//load troop wo a proxy
|
||||||
|
Troop2 _troop = session.find( Troop2.class, disney.getId() );
|
||||||
|
Soldier2 _soldier = session.find( Soldier2.class, mickey.getId() );
|
||||||
|
|
||||||
|
try {
|
||||||
|
session.flush();
|
||||||
|
}
|
||||||
|
catch (IllegalStateException e) {
|
||||||
|
fail( "Should not raise an exception" );
|
||||||
|
}
|
||||||
|
session.remove( _troop );
|
||||||
|
session.remove( _soldier );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.FetchType;
|
import javax.persistence.FetchType;
|
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
import javax.persistence.OneToMany;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
@DomainModel(annotatedClasses = {
|
||||||
|
MergeTest.Order.class,
|
||||||
|
MergeTest.Item.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class MergeTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMergeDetachedEntityWithNewOneToManyElements(SessionFactoryScope scope) {
|
||||||
|
Order order = new Order();
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
session.persist( order );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
Item item1 = new Item();
|
||||||
|
item1.name = "i1";
|
||||||
|
|
||||||
|
Item item2 = new Item();
|
||||||
|
item2.name = "i2";
|
||||||
|
|
||||||
|
order.addItem( item1 );
|
||||||
|
order.addItem( item2 );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
session.merge( order );
|
||||||
|
session.flush();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Order _order = session.find( Order.class, order.id );
|
||||||
|
assertEquals( 2, _order.items.size() );
|
||||||
|
session.remove( _order );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMergeLoadedEntityWithNewOneToManyElements(SessionFactoryScope scope) {
|
||||||
|
Order order = new Order();
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
session.persist( order );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Order _order = session.find( Order.class, order.id );
|
||||||
|
Item item1 = new Item();
|
||||||
|
item1.name = "i1";
|
||||||
|
Item item2 = new Item();
|
||||||
|
item2.name = "i2";
|
||||||
|
_order.addItem( item1 );
|
||||||
|
_order.addItem( item2 );
|
||||||
|
session.merge( _order );
|
||||||
|
session.flush();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Order _order = session.find( Order.class, order.id );
|
||||||
|
assertEquals( 2, _order.items.size() );
|
||||||
|
session.remove( _order );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public static class Order {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@OneToMany(cascade = CascadeType.ALL, mappedBy = "order", orphanRemoval = true)
|
||||||
|
private List<Item> items = new ArrayList<Item>();
|
||||||
|
|
||||||
|
public Order() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addItem(Item item) {
|
||||||
|
items.add( item );
|
||||||
|
item.order = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public static class Item {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
private Order order;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
|
||||||
|
import org.hibernate.LockMode;
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.annotations.GenericGenerator;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
@DomainModel(annotatedClasses = {
|
||||||
|
MergeWithTransientNonCascadedAssociationTest.Person.class,
|
||||||
|
MergeWithTransientNonCascadedAssociationTest.Address.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class MergeWithTransientNonCascadedAssociationTest {
|
||||||
|
@Test
|
||||||
|
public void testMergeWithTransientNonCascadedAssociation(SessionFactoryScope scope) {
|
||||||
|
Person person = new Person();
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
session.persist( person );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
person.address = new Address();
|
||||||
|
|
||||||
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
session.getTransaction().begin();
|
||||||
|
session.merge( person );
|
||||||
|
try {
|
||||||
|
session.flush();
|
||||||
|
fail( "Expecting IllegalStateException" );
|
||||||
|
}
|
||||||
|
catch (IllegalStateException ise) {
|
||||||
|
// expected...
|
||||||
|
session.getTransaction().rollback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
person.address = null;
|
||||||
|
session.unwrap( Session.class ).lock( person, LockMode.NONE );
|
||||||
|
session.unwrap( Session.class ).delete( person );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Person")
|
||||||
|
public static class Person {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(generator = "increment")
|
||||||
|
@GenericGenerator(name = "increment", strategy = "increment")
|
||||||
|
private Integer id;
|
||||||
|
@ManyToOne
|
||||||
|
private Address address;
|
||||||
|
|
||||||
|
public Person() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Address")
|
||||||
|
public static class Address {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(generator = "increment_1")
|
||||||
|
@GenericGenerator(name = "increment_1", strategy = "increment")
|
||||||
|
private Integer id;
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.FetchType;
|
import javax.persistence.FetchType;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.FetchType;
|
import javax.persistence.FetchType;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.FetchType;
|
import javax.persistence.FetchType;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade;
|
package org.hibernate.orm.test.jpa.cascade;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multicircle;
|
package org.hibernate.orm.test.jpa.cascade.multicircle;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multicircle;
|
package org.hibernate.orm.test.jpa.cascade.multicircle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* No Documentation
|
* No Documentation
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multicircle;
|
package org.hibernate.orm.test.jpa.cascade.multicircle;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multicircle;
|
package org.hibernate.orm.test.jpa.cascade.multicircle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* No Documentation
|
* No Documentation
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multicircle;
|
package org.hibernate.orm.test.jpa.cascade.multicircle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* No Documentation
|
* No Documentation
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multicircle;
|
package org.hibernate.orm.test.jpa.cascade.multicircle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* No Documentation
|
* No Documentation
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multicircle;
|
package org.hibernate.orm.test.jpa.cascade.multicircle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* No Documentation
|
* No Documentation
|
|
@ -0,0 +1,321 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cascade.multicircle;
|
||||||
|
|
||||||
|
import javax.persistence.RollbackException;
|
||||||
|
|
||||||
|
import org.hibernate.TransientPropertyValueException;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.FailureExpected;
|
||||||
|
import org.hibernate.testing.orm.junit.Jpa;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test uses a complicated model that requires Hibernate to delay
|
||||||
|
* inserts until non-nullable transient entity dependencies are resolved.
|
||||||
|
* <p>
|
||||||
|
* All IDs are generated from a sequence.
|
||||||
|
* <p>
|
||||||
|
* JPA cascade types are used (javax.persistence.CascadeType)..
|
||||||
|
* <p>
|
||||||
|
* This test uses the following model:
|
||||||
|
*
|
||||||
|
* <code>
|
||||||
|
* ------------------------------ N G
|
||||||
|
* |
|
||||||
|
* | 1
|
||||||
|
* | |
|
||||||
|
* | |
|
||||||
|
* | N
|
||||||
|
* |
|
||||||
|
* | E N--------------0,1 * F
|
||||||
|
* |
|
||||||
|
* | 1 N
|
||||||
|
* | | |
|
||||||
|
* | | |
|
||||||
|
* 1 N |
|
||||||
|
* * |
|
||||||
|
* B * N---1 D * 1------------------
|
||||||
|
* *
|
||||||
|
* N N
|
||||||
|
* | |
|
||||||
|
* | |
|
||||||
|
* 1 |
|
||||||
|
* |
|
||||||
|
* C * 1-----
|
||||||
|
* </code>
|
||||||
|
* <p>
|
||||||
|
* In the diagram, all associations are bidirectional;
|
||||||
|
* assocations marked with '*' cascade persist, save, merge operations to the
|
||||||
|
* associated entities (e.g., B cascades persist to D, but D does not cascade
|
||||||
|
* persist to B);
|
||||||
|
* <p>
|
||||||
|
* b, c, d, e, f, and g are all transient unsaved that are associated with each other.
|
||||||
|
* <p>
|
||||||
|
* When saving b, the entities are added to the ActionQueue in the following order:
|
||||||
|
* c, d (depends on e), f (depends on d, g), e, b, g.
|
||||||
|
* <p>
|
||||||
|
* Entities are inserted in the following order:
|
||||||
|
* c, e, d, b, g, f.
|
||||||
|
*/
|
||||||
|
@Jpa(
|
||||||
|
annotatedClasses = {
|
||||||
|
B.class,
|
||||||
|
C.class,
|
||||||
|
D.class,
|
||||||
|
E.class,
|
||||||
|
F.class,
|
||||||
|
G.class
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public class MultiCircleJpaCascadeTest {
|
||||||
|
private B b;
|
||||||
|
private C c;
|
||||||
|
private D d;
|
||||||
|
private E e;
|
||||||
|
private F f;
|
||||||
|
private G g;
|
||||||
|
private boolean skipCleanup;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setup() {
|
||||||
|
b = new B();
|
||||||
|
c = new C();
|
||||||
|
d = new D();
|
||||||
|
e = new E();
|
||||||
|
f = new F();
|
||||||
|
g = new G();
|
||||||
|
|
||||||
|
b.getGCollection().add( g );
|
||||||
|
b.setC( c );
|
||||||
|
b.setD( d );
|
||||||
|
|
||||||
|
c.getBCollection().add( b );
|
||||||
|
c.getDCollection().add( d );
|
||||||
|
|
||||||
|
d.getBCollection().add( b );
|
||||||
|
d.setC( c );
|
||||||
|
d.setE( e );
|
||||||
|
d.getFCollection().add( f );
|
||||||
|
|
||||||
|
e.getDCollection().add( d );
|
||||||
|
e.setF( f );
|
||||||
|
|
||||||
|
f.getECollection().add( e );
|
||||||
|
f.setD( d );
|
||||||
|
f.setG( g );
|
||||||
|
|
||||||
|
g.setB( b );
|
||||||
|
g.getFCollection().add( f );
|
||||||
|
|
||||||
|
skipCleanup = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public void cleanup(EntityManagerFactoryScope scope) {
|
||||||
|
if ( !skipCleanup ) {
|
||||||
|
b.setC( null );
|
||||||
|
b.setD( null );
|
||||||
|
b.getGCollection().remove( g );
|
||||||
|
|
||||||
|
c.getBCollection().remove( b );
|
||||||
|
c.getDCollection().remove( d );
|
||||||
|
|
||||||
|
d.getBCollection().remove( b );
|
||||||
|
d.setC( null );
|
||||||
|
d.setE( null );
|
||||||
|
d.getFCollection().remove( f );
|
||||||
|
|
||||||
|
e.getDCollection().remove( d );
|
||||||
|
e.setF( null );
|
||||||
|
|
||||||
|
f.setD( null );
|
||||||
|
f.getECollection().remove( e );
|
||||||
|
f.setG( null );
|
||||||
|
|
||||||
|
g.setB( null );
|
||||||
|
g.getFCollection().remove( f );
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
b = entityManager.merge( b );
|
||||||
|
c = entityManager.merge( c );
|
||||||
|
d = entityManager.merge( d );
|
||||||
|
e = entityManager.merge( e );
|
||||||
|
f = entityManager.merge( f );
|
||||||
|
g = entityManager.merge( g );
|
||||||
|
entityManager.remove( f );
|
||||||
|
entityManager.remove( g );
|
||||||
|
entityManager.remove( b );
|
||||||
|
entityManager.remove( d );
|
||||||
|
entityManager.remove( e );
|
||||||
|
entityManager.remove( c );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPersist(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
entityManager.persist( b );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
check( scope );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPersistNoCascadeToTransient(EntityManagerFactoryScope scope) {
|
||||||
|
skipCleanup = true;
|
||||||
|
scope.inEntityManager(
|
||||||
|
entityManager -> {
|
||||||
|
entityManager.getTransaction().begin();
|
||||||
|
try {
|
||||||
|
entityManager.persist( c );
|
||||||
|
fail( "should have failed." );
|
||||||
|
}
|
||||||
|
catch (IllegalStateException ex) {
|
||||||
|
assertTrue( TransientPropertyValueException.class.isInstance( ex.getCause() ) );
|
||||||
|
TransientPropertyValueException pve = (TransientPropertyValueException) ex.getCause();
|
||||||
|
assertEquals( G.class.getName(), pve.getTransientEntityName() );
|
||||||
|
assertEquals( F.class.getName(), pve.getPropertyOwnerEntityName() );
|
||||||
|
assertEquals( "g", pve.getPropertyName() );
|
||||||
|
}
|
||||||
|
entityManager.getTransaction().rollback();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@FailureExpected(jiraKey = "HHH-6999") // remove skipCleanup below when this annotation is removed, added it to avoid failure in the cleanup
|
||||||
|
// fails on d.e; should pass
|
||||||
|
public void testPersistThenUpdate(EntityManagerFactoryScope scope) {
|
||||||
|
skipCleanup = true;
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
entityManager.persist( b );
|
||||||
|
// remove old e from associations
|
||||||
|
e.getDCollection().remove( d );
|
||||||
|
d.setE( null );
|
||||||
|
f.getECollection().remove( e );
|
||||||
|
e.setF( null );
|
||||||
|
// add new e to associations
|
||||||
|
e = new E();
|
||||||
|
e.getDCollection().add( d );
|
||||||
|
f.getECollection().add( e );
|
||||||
|
d.setE( e );
|
||||||
|
e.setF( f );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
check( scope );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPersistThenUpdateNoCascadeToTransient(EntityManagerFactoryScope scope) {
|
||||||
|
// expected to fail, so nothing will be persisted.
|
||||||
|
skipCleanup = true;
|
||||||
|
|
||||||
|
scope.inEntityManager(
|
||||||
|
entityManager -> {
|
||||||
|
// remove elements from collections and persist
|
||||||
|
c.getBCollection().clear();
|
||||||
|
c.getDCollection().clear();
|
||||||
|
|
||||||
|
entityManager.getTransaction().begin();
|
||||||
|
entityManager.persist( c );
|
||||||
|
// now add the elements back
|
||||||
|
c.getBCollection().add( b );
|
||||||
|
c.getDCollection().add( d );
|
||||||
|
try {
|
||||||
|
entityManager.getTransaction().commit();
|
||||||
|
fail( "should have thrown IllegalStateException" );
|
||||||
|
}
|
||||||
|
catch (RollbackException ex) {
|
||||||
|
assertTrue( ex.getCause() instanceof IllegalStateException );
|
||||||
|
IllegalStateException ise = (IllegalStateException) ex.getCause();
|
||||||
|
// should fail on entity g (due to no cascade to f.g);
|
||||||
|
// instead it fails on entity e ( due to no cascade to d.e)
|
||||||
|
// because e is not in the process of being saved yet.
|
||||||
|
// when HHH-6999 is fixed, this test should be changed to
|
||||||
|
// check for g and f.g
|
||||||
|
//noinspection ThrowableResultOfMethodCallIgnored
|
||||||
|
TransientPropertyValueException tpve = assertTyping(
|
||||||
|
TransientPropertyValueException.class,
|
||||||
|
ise.getCause()
|
||||||
|
);
|
||||||
|
assertEquals( E.class.getName(), tpve.getTransientEntityName() );
|
||||||
|
assertEquals( D.class.getName(), tpve.getPropertyOwnerEntityName() );
|
||||||
|
assertEquals( "e", tpve.getPropertyName() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMerge(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
b = entityManager.merge( b );
|
||||||
|
c = b.getC();
|
||||||
|
d = b.getD();
|
||||||
|
e = d.getE();
|
||||||
|
f = e.getF();
|
||||||
|
g = f.getG();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
check( scope );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void check(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
B bRead = entityManager.find( B.class, b.getId() );
|
||||||
|
assertEquals( b, bRead );
|
||||||
|
|
||||||
|
G gRead = bRead.getGCollection().iterator().next();
|
||||||
|
assertEquals( g, gRead );
|
||||||
|
C cRead = bRead.getC();
|
||||||
|
assertEquals( c, cRead );
|
||||||
|
D dRead = bRead.getD();
|
||||||
|
assertEquals( d, dRead );
|
||||||
|
|
||||||
|
assertSame( bRead, cRead.getBCollection().iterator().next() );
|
||||||
|
assertSame( dRead, cRead.getDCollection().iterator().next() );
|
||||||
|
|
||||||
|
assertSame( bRead, dRead.getBCollection().iterator().next() );
|
||||||
|
assertEquals( cRead, dRead.getC() );
|
||||||
|
E eRead = dRead.getE();
|
||||||
|
assertEquals( e, eRead );
|
||||||
|
F fRead = dRead.getFCollection().iterator().next();
|
||||||
|
assertEquals( f, fRead );
|
||||||
|
|
||||||
|
assertSame( dRead, eRead.getDCollection().iterator().next() );
|
||||||
|
assertSame( fRead, eRead.getF() );
|
||||||
|
|
||||||
|
assertSame( eRead, fRead.getECollection().iterator().next() );
|
||||||
|
assertSame( dRead, fRead.getD() );
|
||||||
|
assertSame( gRead, fRead.getG() );
|
||||||
|
|
||||||
|
assertSame( bRead, gRead.getB() );
|
||||||
|
assertSame( fRead, gRead.getFCollection().iterator().next() );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multilevel;
|
package org.hibernate.orm.test.jpa.cascade.multilevel;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multilevel;
|
package org.hibernate.orm.test.jpa.cascade.multilevel;
|
||||||
|
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multilevel;
|
package org.hibernate.orm.test.jpa.cascade.multilevel;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -20,7 +20,6 @@ import javax.persistence.FetchType;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.GenerationType;
|
import javax.persistence.GenerationType;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
import javax.persistence.IdClass;
|
|
||||||
import javax.persistence.JoinColumn;
|
import javax.persistence.JoinColumn;
|
||||||
import javax.persistence.JoinColumns;
|
import javax.persistence.JoinColumns;
|
||||||
import javax.persistence.ManyToOne;
|
import javax.persistence.ManyToOne;
|
||||||
|
@ -28,75 +27,91 @@ import javax.persistence.OneToMany;
|
||||||
import javax.persistence.SequenceGenerator;
|
import javax.persistence.SequenceGenerator;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.FailureExpected;
|
import org.hibernate.testing.FailureExpected;
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.junit.Test;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.NotImplementedYet;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
public class MultiLevelCascadeCollectionEmbeddableTest extends BaseEntityManagerFunctionalTestCase {
|
@DomainModel(annotatedClasses = {
|
||||||
|
MultiLevelCascadeCollectionEmbeddableTest.MainEntity.class,
|
||||||
|
MultiLevelCascadeCollectionEmbeddableTest.SubEntity.class,
|
||||||
|
MultiLevelCascadeCollectionEmbeddableTest.AnotherSubSubEntity.class,
|
||||||
|
MultiLevelCascadeCollectionEmbeddableTest.SubSubEntity.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
@NotImplementedYet(reason = "NotImplementedYetException thrown in the initialization method, by NativeNonSelectQueryPlanImpl.executeUpdate()")
|
||||||
|
public class MultiLevelCascadeCollectionEmbeddableTest {
|
||||||
|
|
||||||
private static final Logger log = Logger.getLogger( MultiLevelCascadeCollectionEmbeddableTest.class );
|
private static final Logger log = Logger.getLogger( MultiLevelCascadeCollectionEmbeddableTest.class );
|
||||||
|
private boolean initialized = false;
|
||||||
|
|
||||||
@Override
|
//TODO this could be implemented with @BeforeAll, if we move to Junit 5.5 or higher. The way to intercept exceptions in this method, inside
|
||||||
protected Class[] getAnnotatedClasses() {
|
// the @NotImplementedYet extension would be by harnessing LifecycleMethodExecutionExceptionHandler, or InvocationInterceptor,
|
||||||
return new Class[] {
|
// and both are Junit 5.5 (and experimental)
|
||||||
MainEntity.class,
|
protected void initialize(SessionFactoryScope scope) {
|
||||||
SubEntity.class,
|
scope.inTransaction(
|
||||||
AnotherSubSubEntity.class,
|
session -> {
|
||||||
SubSubEntity.class
|
session.createNativeQuery( "INSERT INTO MAIN_TABLE(ID_NUM) VALUES (99427)" ).executeUpdate();
|
||||||
};
|
session.createNativeQuery( "INSERT INTO SUB_TABLE(ID_NUM, SUB_ID, FAMILY_IDENTIFIER, IND_NUM) VALUES (99427, 1, 'A', '123A')" ).executeUpdate();
|
||||||
}
|
session.createNativeQuery( "INSERT INTO SUB_TABLE(ID_NUM, SUB_ID, FAMILY_IDENTIFIER, IND_NUM) VALUES (99427, 2, 'S', '321A')" ).executeUpdate();
|
||||||
|
session.createNativeQuery( "INSERT INTO SUB_SUB_TABLE(ID_NUM, CODE, IND_NUM) VALUES (99427, 'CODE1', '123A')" ).executeUpdate();
|
||||||
protected void afterEntityManagerFactoryBuilt() {
|
}
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
);
|
||||||
entityManager.createNativeQuery( "INSERT INTO MAIN_TABLE(ID_NUM) VALUES (99427)" ).executeUpdate();
|
initialized = true;
|
||||||
entityManager.createNativeQuery( "INSERT INTO SUB_TABLE(ID_NUM, SUB_ID, FAMILY_IDENTIFIER, IND_NUM) VALUES (99427, 1, 'A', '123A')" ).executeUpdate();
|
|
||||||
entityManager.createNativeQuery( "INSERT INTO SUB_TABLE(ID_NUM, SUB_ID, FAMILY_IDENTIFIER, IND_NUM) VALUES (99427, 2, 'S', '321A')" ).executeUpdate();
|
|
||||||
entityManager.createNativeQuery( "INSERT INTO SUB_SUB_TABLE(ID_NUM, CODE, IND_NUM) VALUES (99427, 'CODE1', '123A')" ).executeUpdate();
|
|
||||||
} );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@FailureExpected( jiraKey = "HHH-12291" )
|
@FailureExpected( jiraKey = "HHH-12291" )
|
||||||
public void testHibernateDeleteEntityWithoutInitializingCollections() throws Exception {
|
public void testHibernateDeleteEntityWithoutInitializingCollections(SessionFactoryScope scope) {
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
if ( !initialized ) {
|
||||||
MainEntity mainEntity = entityManager.find(MainEntity.class, 99427L);
|
initialize(scope);
|
||||||
|
}
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
MainEntity mainEntity = session.find(MainEntity.class, 99427L);
|
||||||
|
|
||||||
assertNotNull(mainEntity);
|
assertNotNull(mainEntity);
|
||||||
assertFalse(mainEntity.getSubEntities().isEmpty());
|
assertFalse(mainEntity.getSubEntities().isEmpty());
|
||||||
|
|
||||||
Optional<SubEntity> subEntityToRemove = mainEntity.getSubEntities().stream()
|
Optional<SubEntity> subEntityToRemove = mainEntity.getSubEntities().stream()
|
||||||
.filter(subEntity -> "123A".equals(subEntity.getIndNum())).findFirst();
|
.filter(subEntity -> "123A".equals(subEntity.getIndNum())).findFirst();
|
||||||
subEntityToRemove.ifPresent( mainEntity::removeSubEntity );
|
subEntityToRemove.ifPresent( mainEntity::removeSubEntity );
|
||||||
} );
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestForIssue( jiraKey = "HHH-12294" )
|
@TestForIssue( jiraKey = "HHH-12294" )
|
||||||
public void testHibernateDeleteEntityInitializeCollections() throws Exception {
|
public void testHibernateDeleteEntityInitializeCollections(SessionFactoryScope scope) {
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
if ( !initialized ) {
|
||||||
MainEntity mainEntity = entityManager.find(MainEntity.class, 99427L);
|
initialize(scope);
|
||||||
|
}
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
MainEntity mainEntity = session.find(MainEntity.class, 99427L);
|
||||||
|
|
||||||
assertNotNull(mainEntity);
|
assertNotNull(mainEntity);
|
||||||
assertFalse(mainEntity.getSubEntities().isEmpty());
|
assertFalse(mainEntity.getSubEntities().isEmpty());
|
||||||
|
|
||||||
Optional<SubEntity> subEntityToRemove = mainEntity.getSubEntities().stream()
|
Optional<SubEntity> subEntityToRemove = mainEntity.getSubEntities().stream()
|
||||||
.filter(subEntity -> "123A".equals(subEntity.getIndNum())).findFirst();
|
.filter(subEntity -> "123A".equals(subEntity.getIndNum())).findFirst();
|
||||||
if ( subEntityToRemove.isPresent() ) {
|
if ( subEntityToRemove.isPresent() ) {
|
||||||
SubEntity subEntity = subEntityToRemove.get();
|
SubEntity subEntity = subEntityToRemove.get();
|
||||||
assertEquals( 1, subEntity.getSubSubEntities().size() );
|
assertEquals( 1, subEntity.getSubSubEntities().size() );
|
||||||
assertEquals( 0, subEntity.getAnotherSubSubEntities().size() );
|
assertEquals( 0, subEntity.getAnotherSubSubEntities().size() );
|
||||||
mainEntity.removeSubEntity( subEntity );
|
mainEntity.removeSubEntity( subEntity );
|
||||||
}
|
}
|
||||||
} );
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multilevel;
|
package org.hibernate.orm.test.jpa.cascade.multilevel;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -26,78 +26,93 @@ import javax.persistence.OneToMany;
|
||||||
import javax.persistence.SequenceGenerator;
|
import javax.persistence.SequenceGenerator;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.FailureExpected;
|
import org.hibernate.testing.FailureExpected;
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.junit.Test;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.NotImplementedYet;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
public class MultiLevelCascadeCollectionIdClassTest extends BaseEntityManagerFunctionalTestCase {
|
@DomainModel(annotatedClasses = {
|
||||||
|
MultiLevelCascadeCollectionIdClassTest.MainEntity.class,
|
||||||
|
MultiLevelCascadeCollectionIdClassTest.SubEntity.class,
|
||||||
|
MultiLevelCascadeCollectionIdClassTest.AnotherSubSubEntity.class,
|
||||||
|
MultiLevelCascadeCollectionIdClassTest.SubSubEntity.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
@NotImplementedYet(reason = "NotImplementedYetException thrown in the initialization method, by NativeNonSelectQueryPlanImpl.executeUpdate()")
|
||||||
|
public class MultiLevelCascadeCollectionIdClassTest {
|
||||||
|
|
||||||
private static final Logger log = Logger.getLogger( MultiLevelCascadeCollectionIdClassTest.class );
|
private static final Logger log = Logger.getLogger( MultiLevelCascadeCollectionIdClassTest.class );
|
||||||
|
private boolean initialized = false;
|
||||||
|
|
||||||
@Override
|
//TODO this could be implemented with @BeforeAll, if we move to Junit 5.5 or higher. The way to intercept exceptions in this method, inside
|
||||||
protected Class[] getAnnotatedClasses() {
|
// the @NotImplementedYet extension would be by harnessing LifecycleMethodExecutionExceptionHandler, or InvocationInterceptor,
|
||||||
return new Class[] {
|
// and both are Junit 5.5 (and experimental)
|
||||||
MainEntity.class,
|
protected void initialize(SessionFactoryScope scope) {
|
||||||
SubEntity.class,
|
scope.inTransaction(
|
||||||
AnotherSubSubEntity.class,
|
session -> {
|
||||||
SubSubEntity.class
|
session.createNativeQuery( "INSERT INTO MAIN_TABLE(ID_NUM) VALUES (99427)" ).executeUpdate();
|
||||||
};
|
session.createNativeQuery( "INSERT INTO SUB_TABLE(ID_NUM, SUB_ID, FAMILY_IDENTIFIER, IND_NUM) VALUES (99427, 1, 'A', '123A')" ).executeUpdate();
|
||||||
}
|
session.createNativeQuery( "INSERT INTO SUB_TABLE(ID_NUM, SUB_ID, FAMILY_IDENTIFIER, IND_NUM) VALUES (99427, 2, 'S', '321A')" ).executeUpdate();
|
||||||
|
session.createNativeQuery( "INSERT INTO SUB_SUB_TABLE(ID_NUM, CODE, IND_NUM) VALUES (99427, 'CODE1', '123A')" ).executeUpdate();
|
||||||
protected void afterEntityManagerFactoryBuilt() {
|
}
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
);
|
||||||
entityManager.createNativeQuery( "INSERT INTO MAIN_TABLE(ID_NUM) VALUES (99427)" ).executeUpdate();
|
initialized = true;
|
||||||
entityManager.createNativeQuery( "INSERT INTO SUB_TABLE(ID_NUM, SUB_ID, FAMILY_IDENTIFIER, IND_NUM) VALUES (99427, 1, 'A', '123A')" ).executeUpdate();
|
|
||||||
entityManager.createNativeQuery( "INSERT INTO SUB_TABLE(ID_NUM, SUB_ID, FAMILY_IDENTIFIER, IND_NUM) VALUES (99427, 2, 'S', '321A')" ).executeUpdate();
|
|
||||||
entityManager.createNativeQuery( "INSERT INTO SUB_SUB_TABLE(ID_NUM, CODE, IND_NUM) VALUES (99427, 'CODE1', '123A')" ).executeUpdate();
|
|
||||||
} );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@FailureExpected( jiraKey = "HHH-12291" )
|
@FailureExpected( jiraKey = "HHH-12291" )
|
||||||
public void testHibernateDeleteEntityWithoutInitializingCollections() throws Exception {
|
public void testHibernateDeleteEntityWithoutInitializingCollections(SessionFactoryScope scope) {
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
if ( !initialized ) {
|
||||||
MainEntity mainEntity = entityManager.find(MainEntity.class, 99427L);
|
initialize(scope);
|
||||||
|
}
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
MainEntity mainEntity = session.find(MainEntity.class, 99427L);
|
||||||
|
|
||||||
assertNotNull(mainEntity);
|
assertNotNull(mainEntity);
|
||||||
assertFalse(mainEntity.getSubEntities().isEmpty());
|
assertFalse(mainEntity.getSubEntities().isEmpty());
|
||||||
|
|
||||||
Optional<SubEntity> subEntityToRemove = mainEntity.getSubEntities().stream()
|
Optional<SubEntity> subEntityToRemove = mainEntity.getSubEntities().stream()
|
||||||
.filter(subEntity -> "123A".equals(subEntity.getIndNum())).findFirst();
|
.filter(subEntity -> "123A".equals(subEntity.getIndNum())).findFirst();
|
||||||
subEntityToRemove.ifPresent( mainEntity::removeSubEntity );
|
subEntityToRemove.ifPresent( mainEntity::removeSubEntity );
|
||||||
} );
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestForIssue( jiraKey = "HHH-12294" )
|
@TestForIssue( jiraKey = "HHH-12294" )
|
||||||
public void testHibernateDeleteEntityInitializeCollections() throws Exception {
|
public void testHibernateDeleteEntityInitializeCollections(SessionFactoryScope scope) {
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
if ( !initialized ) {
|
||||||
MainEntity mainEntity = entityManager.find(MainEntity.class, 99427L);
|
initialize(scope);
|
||||||
|
}
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
MainEntity mainEntity = session.find(MainEntity.class, 99427L);
|
||||||
|
|
||||||
assertNotNull(mainEntity);
|
assertNotNull(mainEntity);
|
||||||
assertFalse(mainEntity.getSubEntities().isEmpty());
|
assertFalse(mainEntity.getSubEntities().isEmpty());
|
||||||
|
|
||||||
Optional<SubEntity> subEntityToRemove = mainEntity.getSubEntities().stream()
|
Optional<SubEntity> subEntityToRemove = mainEntity.getSubEntities().stream()
|
||||||
.filter(subEntity -> "123A".equals(subEntity.getIndNum())).findFirst();
|
.filter(subEntity -> "123A".equals(subEntity.getIndNum())).findFirst();
|
||||||
if ( subEntityToRemove.isPresent() ) {
|
if ( subEntityToRemove.isPresent() ) {
|
||||||
SubEntity subEntity = subEntityToRemove.get();
|
SubEntity subEntity = subEntityToRemove.get();
|
||||||
assertEquals( 1, subEntity.getSubSubEntities().size() );
|
assertEquals( 1, subEntity.getSubSubEntities().size() );
|
||||||
assertEquals( 0, subEntity.getAnotherSubSubEntities().size() );
|
assertEquals( 0, subEntity.getAnotherSubSubEntities().size() );
|
||||||
mainEntity.removeSubEntity( subEntity );
|
mainEntity.removeSubEntity( subEntity );
|
||||||
}
|
}
|
||||||
} );
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "MAIN_TABLE")
|
@Table(name = "MAIN_TABLE")
|
||||||
public static class MainEntity implements Serializable {
|
public static class MainEntity implements Serializable {
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multilevel;
|
package org.hibernate.orm.test.jpa.cascade.multilevel;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -16,66 +16,68 @@ import javax.persistence.Id;
|
||||||
import javax.persistence.ManyToOne;
|
import javax.persistence.ManyToOne;
|
||||||
import javax.persistence.OneToMany;
|
import javax.persistence.OneToMany;
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.junit.Test;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
public class MultiLevelCascadeRegularIdBasedParentChildAssociationTest extends BaseEntityManagerFunctionalTestCase {
|
@DomainModel(annotatedClasses = {
|
||||||
|
MultiLevelCascadeRegularIdBasedParentChildAssociationTest.Parent.class,
|
||||||
|
MultiLevelCascadeRegularIdBasedParentChildAssociationTest.Child.class,
|
||||||
|
MultiLevelCascadeRegularIdBasedParentChildAssociationTest.Skill.class,
|
||||||
|
MultiLevelCascadeRegularIdBasedParentChildAssociationTest.Hobby.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class MultiLevelCascadeRegularIdBasedParentChildAssociationTest {
|
||||||
|
|
||||||
private static final Logger log = Logger.getLogger( MultiLevelCascadeRegularIdBasedParentChildAssociationTest.class );
|
private static final Logger log = Logger.getLogger( MultiLevelCascadeRegularIdBasedParentChildAssociationTest.class );
|
||||||
|
|
||||||
@Override
|
@BeforeAll
|
||||||
protected Class[] getAnnotatedClasses() {
|
protected void initialize(SessionFactoryScope scope) {
|
||||||
return new Class[] {
|
scope.inTransaction(
|
||||||
Parent.class,
|
session -> {
|
||||||
Child.class,
|
Parent parent = new Parent();
|
||||||
Skill.class,
|
parent.id = 1L;
|
||||||
Hobby.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void afterEntityManagerFactoryBuilt() {
|
Child child1 = new Child();
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
child1.id = 1L;
|
||||||
Parent parent = new Parent();
|
parent.addChild( child1 );
|
||||||
parent.id = 1L;
|
|
||||||
|
|
||||||
Child child1 = new Child();
|
Child child2 = new Child();
|
||||||
child1.id = 1L;
|
child2.id = 2L;
|
||||||
parent.addChild( child1 );
|
parent.addChild( child2 );
|
||||||
|
|
||||||
Child child2 = new Child();
|
Skill skill = new Skill();
|
||||||
child2.id = 2L;
|
skill.id = 1L;
|
||||||
parent.addChild( child2 );
|
child1.addSkill( skill );
|
||||||
|
|
||||||
Skill skill = new Skill();
|
session.persist( parent );
|
||||||
skill.id = 1L;
|
}
|
||||||
child1.addSkill( skill );
|
);
|
||||||
|
|
||||||
entityManager.persist( parent );
|
|
||||||
} );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestForIssue( jiraKey = "HHH-12291" )
|
@TestForIssue( jiraKey = "HHH-12291" )
|
||||||
public void testHibernateDeleteEntityWithoutInitializingCollections() throws Exception {
|
public void testHibernateDeleteEntityWithoutInitializingCollections(SessionFactoryScope scope) {
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
scope.inTransaction(
|
||||||
Parent mainEntity = entityManager.find( Parent.class, 1L);
|
session -> {
|
||||||
|
Parent mainEntity = session.find( Parent.class, 1L);
|
||||||
|
|
||||||
assertNotNull(mainEntity);
|
assertNotNull(mainEntity);
|
||||||
assertFalse(mainEntity.getChildren().isEmpty());
|
assertFalse(mainEntity.getChildren().isEmpty());
|
||||||
|
|
||||||
Optional<Child> childToRemove = mainEntity.getChildren().stream()
|
Optional<Child> childToRemove = mainEntity.getChildren().stream()
|
||||||
.filter(child -> Long.valueOf( 1L ).equals(child.id)).findFirst();
|
.filter(child -> Long.valueOf( 1L ).equals(child.id)).findFirst();
|
||||||
childToRemove.ifPresent( mainEntity::removeChild );
|
childToRemove.ifPresent( mainEntity::removeChild );
|
||||||
} );
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity(name = "Parent")
|
@Entity(name = "Parent")
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.cascade.multilevel;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||||
|
|
||||||
|
@DomainModel(annotatedClasses = {
|
||||||
|
Top.class,
|
||||||
|
Middle.class,
|
||||||
|
Bottom.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
public class MultiLevelCascadeTest {
|
||||||
|
|
||||||
|
@TestForIssue(jiraKey = "HHH-5299")
|
||||||
|
@Test
|
||||||
|
public void test(SessionFactoryScope scope) {
|
||||||
|
final Top top = new Top();
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
session.persist( top );
|
||||||
|
// Flush 1
|
||||||
|
session.flush();
|
||||||
|
|
||||||
|
Middle middle = new Middle( 1l );
|
||||||
|
top.addMiddle( middle );
|
||||||
|
middle.setTop( top );
|
||||||
|
Bottom bottom = new Bottom();
|
||||||
|
middle.setBottom( bottom );
|
||||||
|
bottom.setMiddle( middle );
|
||||||
|
|
||||||
|
Middle middle2 = new Middle( 2l );
|
||||||
|
top.addMiddle( middle2 );
|
||||||
|
middle2.setTop( top );
|
||||||
|
Bottom bottom2 = new Bottom();
|
||||||
|
middle2.setBottom( bottom2 );
|
||||||
|
bottom2.setMiddle( middle2 );
|
||||||
|
// Flush 2
|
||||||
|
session.flush();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Top found = session.find( Top.class, top.getId() );
|
||||||
|
|
||||||
|
assertEquals( 2, found.getMiddles().size() );
|
||||||
|
for ( Middle loadedMiddle : found.getMiddles() ) {
|
||||||
|
assertSame( found, loadedMiddle.getTop() );
|
||||||
|
assertNotNull( loadedMiddle.getBottom() );
|
||||||
|
}
|
||||||
|
session.remove( found );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cascade.multilevel;
|
package org.hibernate.orm.test.jpa.cascade.multilevel;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cdi;
|
package org.hibernate.orm.test.jpa.cdi;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -27,11 +27,11 @@ import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil2.inTransaction;
|
import static org.hibernate.testing.transaction.TransactionUtil2.inTransaction;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
|
@ -4,25 +4,24 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cdi;
|
package org.hibernate.orm.test.jpa.cdi;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import javax.persistence.EntityManagerFactory;
|
import javax.persistence.EntityManagerFactory;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
|
||||||
import org.hibernate.testing.junit4.ClassLoadingIsolater;
|
import org.hibernate.testing.junit4.ClassLoadingIsolater;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test JPA bootstrapping when CDI is not available for classloading.
|
* Test JPA bootstrapping when CDI is not available for classloading.
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class NoCdiAvailableTest extends BaseUnitTestCase {
|
public class NoCdiAvailableTest {
|
||||||
public static final String[] EXCLUDED_PACKAGES = new String[] {
|
public static final String[] EXCLUDED_PACKAGES = new String[] {
|
||||||
"javax.enterprise.inject.",
|
"javax.enterprise.inject.",
|
||||||
"javax.enterprise.context."
|
"javax.enterprise.context."
|
||||||
|
@ -62,7 +61,7 @@ public class NoCdiAvailableTest extends BaseUnitTestCase {
|
||||||
@Test
|
@Test
|
||||||
public void testJpaBootstrapWithoutCdiAvailable() throws Exception {
|
public void testJpaBootstrapWithoutCdiAvailable() throws Exception {
|
||||||
Class delegateClass = Thread.currentThread().getContextClassLoader().loadClass(
|
Class delegateClass = Thread.currentThread().getContextClassLoader().loadClass(
|
||||||
"org.hibernate.jpa.test.cdi.NoCdiAvailableTestDelegate"
|
"org.hibernate.orm.test.jpa.cdi.NoCdiAvailableTestDelegate"
|
||||||
);
|
);
|
||||||
Method mainMethod = delegateClass.getMethod( "passingNoBeanManager" );
|
Method mainMethod = delegateClass.getMethod( "passingNoBeanManager" );
|
||||||
EntityManagerFactory entityManagerFactory = null;
|
EntityManagerFactory entityManagerFactory = null;
|
||||||
|
@ -79,7 +78,7 @@ public class NoCdiAvailableTest extends BaseUnitTestCase {
|
||||||
@Test
|
@Test
|
||||||
public void testJpaBootstrapWithoutCdiAvailablePassingCdi() throws Throwable {
|
public void testJpaBootstrapWithoutCdiAvailablePassingCdi() throws Throwable {
|
||||||
Class delegateClass = Thread.currentThread().getContextClassLoader().loadClass(
|
Class delegateClass = Thread.currentThread().getContextClassLoader().loadClass(
|
||||||
"org.hibernate.jpa.test.cdi.NoCdiAvailableTestDelegate"
|
"org.hibernate.orm.test.jpa.cdi.NoCdiAvailableTestDelegate"
|
||||||
);
|
);
|
||||||
Method mainMethod = delegateClass.getMethod( "passingBeanManager" );
|
Method mainMethod = delegateClass.getMethod( "passingBeanManager" );
|
||||||
try {
|
try {
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cdi;
|
package org.hibernate.orm.test.jpa.cdi;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cdi.extended;
|
package org.hibernate.orm.test.jpa.cdi.extended;
|
||||||
|
|
||||||
import javax.ejb.LocalBean;
|
import javax.ejb.LocalBean;
|
||||||
import javax.ejb.Stateful;
|
import javax.ejb.Stateful;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cdi.extended;
|
package org.hibernate.orm.test.jpa.cdi.extended;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.cdi.extended;
|
package org.hibernate.orm.test.jpa.cdi.extended;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.ejb.LocalBean;
|
import javax.ejb.LocalBean;
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue