/*
* 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.test.onetomany.inheritance.joined;
import java.util.List;
import java.util.Map.Entry;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
import org.junit.Before;
import org.junit.Test;
import org.jboss.logging.Logger;
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@TestForIssue(jiraKey = "HHH-11005")
public class MappedSuperclassMapTest extends BaseNonConfigCoreFunctionalTestCase {
private static final Logger log = Logger.getLogger( MappedSuperclassMapTest.class );
private static final String SKU001 = "SKU001";
private static final String SKU002 = "SKU002";
private static final String WAR_AND_PEACE = "0140447938";
private static final String ANNA_KARENINA = "0140449175";
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[]{
Book.class,
Library.class,
Product.class
};
}
@Before
public void init() {
doInHibernate( this::sessionFactory, sess -> {
Book book1 = new Book( SKU001, WAR_AND_PEACE);
Book book2 = new Book( SKU002, ANNA_KARENINA);
sess.persist( book1 );
sess.flush();
sess.persist( book2 );
sess.flush();
Library library = new Library();
library.addBook( book1 );
library.addBook( book2 );
sess.persist(library);
} );
}
@Test
public void lookupEntities() {
doInHibernate( this::sessionFactory, sess -> {
List<Library> libraries = sess.createQuery( "FROM Library").list();
assertEquals(1, libraries.size());
Library library = libraries.get( 0);
assertNotNull(library);
assertEquals(2, library.getBooksOnInventory().size());
Book book = library.getBooksOnInventory().get( SKU001);
assertNotNull(book);
Library Library = library;
Library.getBooksOnIsbn().get( WAR_AND_PEACE );
assertEquals(WAR_AND_PEACE, book.getIsbn());
book = library.getBooksOnInventory().get(SKU002);
assertNotNull(book);
assertEquals(ANNA_KARENINA, book.getIsbn());
} );
}
@Test
public void lookupEntities_entrySet() {
doInHibernate( this::sessionFactory, sess -> {
List<Library> libraries = sess.createQuery( "FROM Library").list();
assertEquals(1, libraries.size());
Library library = libraries.get( 0);
assertNotNull(library);
assertEquals(2, library.getBooksOnInventory().size());
for (Entry<String,Book> entry : library.getBooksOnInventory().entrySet()) {
log.info("Found SKU " + entry.getKey() + " with ISBN " + entry.getValue().getIsbn());
}
} );
}
@Test
public void breakReferences() {
doInHibernate( this::sessionFactory, sess -> {
List<Book> books = sess.createQuery( "FROM Book").list();
assertEquals(2, books.size());
for (Book book : books) {
assertNotNull(book.getLibrary());
log.info("Found SKU " + book.getInventoryCode() + " with library " + book.getLibrary().getEntid());
}
for (Book book : books) {
book.getLibrary().removeBook( book );
}
} );
doInHibernate( this::sessionFactory, sess -> {
List<Book> books = sess.createQuery( "FROM Book").list();
assertEquals(2, books.size());
for (Book book : books) {
if (book.getLibrary() == null ) {
log.info("Found SKU " + book.getInventoryCode() + " with no library");
}
}
List<Library> libraries = sess.createQuery( "FROM Library").list();
assertEquals(1, libraries.size());
Library library = libraries.get( 0);
assertNotNull(library);
assertEquals(0, library.getBooksOnInventory().size());
log.info("Found Library " + library.getEntid() + " with no books");
} );
}
@Override
protected boolean isCleanupTestDataRequired() {
return true;
}
@Override
protected void cleanupTestData() throws Exception {
doInHibernate( this::sessionFactory, sess -> {
sess.createQuery( "delete from Book" ).executeUpdate();
sess.createQuery( "delete from Library" ).executeUpdate();
} );
}
@Override
protected boolean rebuildSessionFactoryOnError() {
return false;
}
}