/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010, Red Hat Inc. or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.test.annotations.inheritance.joined;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
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
*/
public class JoinedSubclassTest extends BaseCoreFunctionalTestCase {
@Test
public void testDefault() throws Exception {
Session s;
Transaction tx;
s = openSession();
tx = s.beginTransaction();
File doc = new Document( "Enron Stuff To Shred", 1000 );
Folder folder = new Folder( "Enron" );
s.persist( doc );
s.persist( folder );
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
List result = s.createCriteria( File.class ).list();
assertNotNull( result );
assertEquals( 2, result.size() );
File f2 = (File) result.get( 0 );
checkClassType( f2, doc, folder );
f2 = (File) result.get( 1 );
checkClassType( f2, doc, folder );
s.delete( result.get( 0 ) );
s.delete( result.get( 1 ) );
tx.commit();
s.close();
}
@Test
public void testManyToOneOnAbstract() throws Exception {
Folder f = new Folder();
f.setName( "data" );
ProgramExecution remove = new ProgramExecution();
remove.setAction( "remove" );
remove.setAppliesOn( f );
Session s;
Transaction tx;
s = openSession();
tx = s.beginTransaction();
s.persist( f );
s.persist( remove );
tx.commit();
s.clear();
tx = s.beginTransaction();
remove = (ProgramExecution) s.get( ProgramExecution.class, remove.getId() );
assertNotNull( remove );
assertNotNull( remove.getAppliesOn().getName() );
s.delete( remove );
s.delete( remove.getAppliesOn() );
tx.commit();
s.close();
}
private void checkClassType(File fruitToTest, File f, Folder a) {
if ( fruitToTest.getName().equals( f.getName() ) ) {
assertFalse( fruitToTest instanceof Folder );
}
else if ( fruitToTest.getName().equals( a.getName() ) ) {
assertTrue( fruitToTest instanceof Folder );
}
else {
fail( "Result does not contains the previously inserted elements" );
}
}
@Test
public void testJoinedAbstractClass() throws Exception {
Session s;
s = openSession();
s.getTransaction().begin();
Sweater sw = new Sweater();
sw.setColor( "Black" );
sw.setSize( 2 );
sw.setSweat( true );
s.persist( sw );
s.getTransaction().commit();
s.clear();
s = openSession();
s.getTransaction().begin();
sw = (Sweater) s.get( Sweater.class, sw.getId() );
s.delete( sw );
s.getTransaction().commit();
s.close();
}
@Test
public void testInheritance() throws Exception {
Session session = openSession();
Transaction transaction = session.beginTransaction();
String eventPK = "event1";
EventInformation event = (EventInformation) session.get( EventInformation.class, eventPK );
if ( event == null ) {
event = new EventInformation();
event.setNotificationId( eventPK );
session.persist( event );
}
String alarmPK = "alarm1";
Alarm alarm = (Alarm) session.get( Alarm.class, alarmPK );
if ( alarm == null ) {
alarm = new Alarm();
alarm.setNotificationId( alarmPK );
alarm.setEventInfo( event );
session.persist( alarm );
}
transaction.commit();
session.close();
}
@Test
@TestForIssue( jiraKey = "HHH-4250" )
public void testManyToOneWithJoinTable() {
//HHH-4250 : @ManyToOne - @OneToMany doesn't work with @Inheritance(strategy= InheritanceType.JOINED)
Session s = openSession();
Transaction tx = s.beginTransaction();
Client c1 = new Client();
c1.setFirstname("Firstname1");
c1.setName("Name1");
c1.setCode("1234");
c1.setStreet("Street1");
c1.setCity("City1");
Account a1 = new Account();
a1.setNumber("1000");
a1.setBalance(5000.0);
a1.addClient(c1);
s.persist(c1);
s.persist(a1);
s.flush();
s.clear();
c1 = (Client) s.load(Client.class, c1.getId());
assertEquals( 5000.0, c1.getAccount().getBalance(), 0.01 );
s.flush();
s.clear();
a1 = (Account) s.load(Account.class,a1.getId());
Set<Client> clients = a1.getClients();
assertEquals(1, clients.size());
Iterator<Client> it = clients.iterator();
c1 = it.next();
assertEquals("Name1", c1.getName());
tx.rollback();
s.close();
}
@Test
@TestForIssue( jiraKey = "HHH-4240" )
public void testSecondaryTables() {
// HHH-4240 - SecondaryTables not recognized when using JOINED inheritance
Session s = openSession();
s.getTransaction().begin();
Company company = new Company();
company.setCustomerName("Mama");
company.setCustomerCode("123");
company.setCompanyName("Mama Mia Pizza");
company.setCompanyAddress("Rome");
s.persist( company );
s.getTransaction().commit();
s.clear();
s = openSession();
s.getTransaction().begin();
company = (Company) s.get( Company.class, company.getId());
assertEquals("Mama", company.getCustomerName());
assertEquals("123", company.getCustomerCode());
assertEquals("Mama Mia Pizza", company.getCompanyName());
assertEquals("Rome", company.getCompanyAddress());
s.delete( company );
s.getTransaction().commit();
s.close();
}
@Override
protected Class[] getAnnotatedClasses() {
return new Class[]{
File.class,
Folder.class,
Document.class,
SymbolicLink.class,
ProgramExecution.class,
Clothing.class,
Sweater.class,
EventInformation.class,
Alarm.class,
Client.class,
Account.class,
Company.class
};
}
}