/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2011, 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.embedded;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.hibernate.test.annotations.embedded.FloatLeg.RateIndex;
import org.hibernate.test.annotations.embedded.Leg.Frequency;
import org.hibernate.test.util.SchemaUtil;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
* @author Emmanuel Bernard
*/
public class EmbeddedTest extends BaseCoreFunctionalTestCase {
@Test
public void testSimple() throws Exception {
Session s;
Transaction tx;
Person p = new Person();
Address a = new Address();
Country c = new Country();
Country bornCountry = new Country();
c.setIso2( "DM" );
c.setName( "Matt Damon Land" );
bornCountry.setIso2( "US" );
bornCountry.setName( "United States of America" );
a.address1 = "colorado street";
a.city = "Springfield";
a.country = c;
p.address = a;
p.bornIn = bornCountry;
p.name = "Homer";
s = openSession();
tx = s.beginTransaction();
s.persist( p );
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
p = (Person) s.get( Person.class, p.id );
assertNotNull( p );
assertNotNull( p.address );
assertEquals( "Springfield", p.address.city );
assertNotNull( p.address.country );
assertEquals( "DM", p.address.country.getIso2() );
assertNotNull( p.bornIn );
assertEquals( "US", p.bornIn.getIso2() );
tx.commit();
s.close();
}
@Test
public void testCompositeId() throws Exception {
Session s;
Transaction tx;
RegionalArticlePk pk = new RegionalArticlePk();
pk.iso2 = "FR";
pk.localUniqueKey = "1234567890123";
RegionalArticle reg = new RegionalArticle();
reg.setName( "Je ne veux pes rester sage - Dolly" );
reg.setPk( pk );
s = openSession();
tx = s.beginTransaction();
s.persist( reg );
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
reg = (RegionalArticle) s.get( RegionalArticle.class, (Serializable) reg.getPk() );
assertNotNull( reg );
assertNotNull( reg.getPk() );
assertEquals( "Je ne veux pes rester sage - Dolly", reg.getName() );
assertEquals( "FR", reg.getPk().iso2 );
tx.commit();
s.close();
}
@Test
public void testManyToOneInsideComponent() throws Exception {
Session s;
Transaction tx;
s = openSession();
tx = s.beginTransaction();
Person p = new Person();
Country bornIn = new Country();
bornIn.setIso2( "FR" );
bornIn.setName( "France" );
p.bornIn = bornIn;
p.name = "Emmanuel";
AddressType type = new AddressType();
type.setName( "Primary Home" );
s.persist( type );
Country currentCountry = new Country();
currentCountry.setIso2( "US" );
currentCountry.setName( "USA" );
Address add = new Address();
add.address1 = "4 square street";
add.city = "San diego";
add.country = currentCountry;
add.type = type;
p.address = add;
s.persist( p );
tx.commit();
s = openSession();
tx = s.beginTransaction();
Query q = s.createQuery( "select p from Person p where p.address.city = :city" );
q.setString( "city", add.city );
List result = q.list();
Person samePerson = (Person) result.get( 0 );
assertNotNull( samePerson.address.type );
assertEquals( type.getName(), samePerson.address.type.getName() );
tx.commit();
s.close();
}
@Test
public void testEmbeddedSuperclass() {
Session s;
Transaction tx;
s = openSession();
tx = s.beginTransaction();
VanillaSwap swap = new VanillaSwap();
swap.setInstrumentId( "US345421" );
swap.setCurrency( VanillaSwap.Currency.EUR );
FixedLeg fixed = new FixedLeg();
fixed.setPaymentFrequency( Leg.Frequency.SEMIANNUALLY );
fixed.setRate( 5.6 );
FloatLeg floating = new FloatLeg();
floating.setPaymentFrequency( Leg.Frequency.QUARTERLY );
floating.setRateIndex( FloatLeg.RateIndex.LIBOR );
floating.setRateSpread( 1.1 );
swap.setFixedLeg( fixed );
swap.setFloatLeg( floating );
s.persist( swap );
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
swap = (VanillaSwap) s.get( VanillaSwap.class, swap.getInstrumentId() );
// All fields must be filled with non-default values
fixed = swap.getFixedLeg();
assertNotNull( "Fixed leg retrieved as null", fixed );
floating = swap.getFloatLeg();
assertNotNull( "Floating leg retrieved as null", floating );
assertEquals( Leg.Frequency.SEMIANNUALLY, fixed.getPaymentFrequency() );
assertEquals( Leg.Frequency.QUARTERLY, floating.getPaymentFrequency() );
s.delete( swap );
tx.commit();
s.close();
}
@Test
public void testDottedProperty() {
Session s;
Transaction tx;
s = openSession();
tx = s.beginTransaction();
// Create short swap
Swap shortSwap = new Swap();
shortSwap.setTenor( 2 );
FixedLeg shortFixed = new FixedLeg();
shortFixed.setPaymentFrequency( Frequency.SEMIANNUALLY );
shortFixed.setRate( 5.6 );
FloatLeg shortFloating = new FloatLeg();
shortFloating.setPaymentFrequency( Frequency.QUARTERLY );
shortFloating.setRateIndex( RateIndex.LIBOR );
shortFloating.setRateSpread( 1.1 );
shortSwap.setFixedLeg( shortFixed );
shortSwap.setFloatLeg( shortFloating );
// Create medium swap
Swap swap = new Swap();
swap.setTenor( 7 );
FixedLeg fixed = new FixedLeg();
fixed.setPaymentFrequency( Frequency.MONTHLY );
fixed.setRate( 7.6 );
FloatLeg floating = new FloatLeg();
floating.setPaymentFrequency( Frequency.MONTHLY );
floating.setRateIndex( RateIndex.TIBOR );
floating.setRateSpread( 0.8 );
swap.setFixedLeg( fixed );
swap.setFloatLeg( floating );
// Create long swap
Swap longSwap = new Swap();
longSwap.setTenor( 7 );
FixedLeg longFixed = new FixedLeg();
longFixed.setPaymentFrequency( Frequency.MONTHLY );
longFixed.setRate( 7.6 );
FloatLeg longFloating = new FloatLeg();
longFloating.setPaymentFrequency( Frequency.MONTHLY );
longFloating.setRateIndex( RateIndex.TIBOR );
longFloating.setRateSpread( 0.8 );
longSwap.setFixedLeg( longFixed );
longSwap.setFloatLeg( longFloating );
// Compose a curve spread deal
SpreadDeal deal = new SpreadDeal();
deal.setId( "FX45632" );
deal.setNotional( 450000.0 );
deal.setShortSwap( shortSwap );
deal.setSwap( swap );
deal.setLongSwap( longSwap );
s.persist( deal );
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
deal = (SpreadDeal) s.get( SpreadDeal.class, deal.getId() );
// All fields must be filled with non-default values
assertNotNull( "Short swap is null.", deal.getShortSwap() );
assertNotNull( "Swap is null.", deal.getSwap() );
assertNotNull( "Long swap is null.", deal.getLongSwap() );
assertEquals( 2, deal.getShortSwap().getTenor() );
assertEquals( 7, deal.getSwap().getTenor() );
assertEquals( 7, deal.getLongSwap().getTenor() );
assertNotNull( "Short fixed leg is null.", deal.getShortSwap().getFixedLeg() );
assertNotNull( "Short floating leg is null.", deal.getShortSwap().getFloatLeg() );
assertNotNull( "Fixed leg is null.", deal.getSwap().getFixedLeg() );
assertNotNull( "Floating leg is null.", deal.getSwap().getFloatLeg() );
assertNotNull( "Long fixed leg is null.", deal.getLongSwap().getFixedLeg() );
assertNotNull( "Long floating leg is null.", deal.getLongSwap().getFloatLeg() );
assertEquals( Frequency.SEMIANNUALLY, deal.getShortSwap().getFixedLeg().getPaymentFrequency() );
assertEquals( Frequency.QUARTERLY, deal.getShortSwap().getFloatLeg().getPaymentFrequency() );
assertEquals( Frequency.MONTHLY, deal.getSwap().getFixedLeg().getPaymentFrequency() );
assertEquals( Frequency.MONTHLY, deal.getSwap().getFloatLeg().getPaymentFrequency() );
assertEquals( Frequency.MONTHLY, deal.getLongSwap().getFixedLeg().getPaymentFrequency() );
assertEquals( Frequency.MONTHLY, deal.getLongSwap().getFloatLeg().getPaymentFrequency() );
assertEquals( 5.6, deal.getShortSwap().getFixedLeg().getRate(), 0.01 );
assertEquals( 7.6, deal.getSwap().getFixedLeg().getRate(), 0.01 );
assertEquals( 7.6, deal.getLongSwap().getFixedLeg().getRate(), 0.01 );
assertEquals( RateIndex.LIBOR, deal.getShortSwap().getFloatLeg().getRateIndex() );
assertEquals( RateIndex.TIBOR, deal.getSwap().getFloatLeg().getRateIndex() );
assertEquals( RateIndex.TIBOR, deal.getLongSwap().getFloatLeg().getRateIndex() );
assertEquals( 1.1, deal.getShortSwap().getFloatLeg().getRateSpread(), 0.01 );
assertEquals( 0.8, deal.getSwap().getFloatLeg().getRateSpread(), 0.01 );
assertEquals( 0.8, deal.getLongSwap().getFloatLeg().getRateSpread(), 0.01 );
s.delete( deal );
tx.commit();
s.close();
}
@Test
public void testEmbeddedInSecondaryTable() throws Exception {
Session s;
s = openSession();
s.getTransaction().begin();
Book book = new Book();
book.setIsbn( "1234" );
book.setName( "HiA Second Edition" );
Summary summary = new Summary();
summary.setText( "This is a HiA SE summary" );
summary.setSize( summary.getText().length() );
book.setSummary( summary );
s.persist( book );
s.getTransaction().commit();
s.clear();
Transaction tx = s.beginTransaction();
Book loadedBook = (Book) s.get( Book.class, book.getIsbn() );
assertNotNull( loadedBook.getSummary() );
assertEquals( book.getSummary().getText(), loadedBook.getSummary().getText() );
s.delete( loadedBook );
tx.commit();
s.close();
}
@Test
public void testParent() throws Exception {
Session s;
s = openSession();
s.getTransaction().begin();
Book book = new Book();
book.setIsbn( "1234" );
book.setName( "HiA Second Edition" );
Summary summary = new Summary();
summary.setText( "This is a HiA SE summary" );
summary.setSize( summary.getText().length() );
book.setSummary( summary );
s.persist( book );
s.getTransaction().commit();
s.clear();
Transaction tx = s.beginTransaction();
Book loadedBook = (Book) s.get( Book.class, book.getIsbn() );
assertNotNull( loadedBook.getSummary() );
assertEquals( loadedBook, loadedBook.getSummary().getSummarizedBook() );
s.delete( loadedBook );
tx.commit();
s.close();
}
@Test
public void testEmbeddedAndMultipleManyToOne() throws Exception {
Session s;
s = openSession();
Transaction tx = s.beginTransaction();
CorpType type = new CorpType();
type.setType( "National" );
s.persist( type );
Nationality nat = new Nationality();
nat.setName( "Canadian" );
s.persist( nat );
InternetProvider provider = new InternetProvider();
provider.setBrandName( "Fido" );
LegalStructure structure = new LegalStructure();
structure.setCorporationType( type );
structure.setCountry( "Canada" );
structure.setName( "Rogers" );
provider.setOwner( structure );
structure.setOrigin( nat );
s.persist( provider );
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
provider = (InternetProvider) s.get( InternetProvider.class, provider.getId() );
assertNotNull( provider.getOwner() );
assertNotNull( "Many to one not set", provider.getOwner().getCorporationType() );
assertEquals( "Wrong link", type.getType(), provider.getOwner().getCorporationType().getType() );
assertNotNull( "2nd Many to one not set", provider.getOwner().getOrigin() );
assertEquals( "Wrong 2nd link", nat.getName(), provider.getOwner().getOrigin().getName() );
s.delete( provider );
s.delete( provider.getOwner().getCorporationType() );
s.delete( provider.getOwner().getOrigin() );
tx.commit();
s.close();
}
@Test
public void testEmbeddedAndOneToMany() throws Exception {
Session s;
s = openSession();
Transaction tx = s.beginTransaction();
InternetProvider provider = new InternetProvider();
provider.setBrandName( "Fido" );
LegalStructure structure = new LegalStructure();
structure.setCountry( "Canada" );
structure.setName( "Rogers" );
provider.setOwner( structure );
s.persist( provider );
Manager manager = new Manager();
manager.setName( "Bill" );
manager.setEmployer( provider );
structure.getTopManagement().add( manager );
s.persist( manager );
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
provider = (InternetProvider) s.get( InternetProvider.class, provider.getId() );
assertNotNull( provider.getOwner() );
Set<Manager> topManagement = provider.getOwner().getTopManagement();
assertNotNull( "OneToMany not set", topManagement );
assertEquals( "Wrong number of elements", 1, topManagement.size() );
manager = (Manager) topManagement.iterator().next();
assertEquals( "Wrong element", "Bill", manager.getName() );
s.delete( manager );
s.delete( provider );
tx.commit();
s.close();
}
@Test
public void testDefaultCollectionTable() throws Exception {
//are the tables correct?
assertTrue( SchemaUtil.isTablePresent("WealthyPerson_vacationHomes", configuration() ) );
assertTrue( SchemaUtil.isTablePresent("WealthyPerson_legacyVacationHomes", configuration() ) );
assertTrue( SchemaUtil.isTablePresent("WelPers_VacHomes", configuration() ) );
//just to make sure, use the mapping
Session s;
Transaction tx;
WealthyPerson p = new WealthyPerson();
Address a = new Address();
Address vacation = new Address();
Country c = new Country();
Country bornCountry = new Country();
c.setIso2( "DM" );
c.setName( "Matt Damon Land" );
bornCountry.setIso2( "US" );
bornCountry.setName( "United States of America" );
a.address1 = "colorado street";
a.city = "Springfield";
a.country = c;
vacation.address1 = "rock street";
vacation.city = "Plymouth";
vacation.country = c;
p.vacationHomes.add(vacation);
p.address = a;
p.bornIn = bornCountry;
p.name = "Homer";
s = openSession();
tx = s.beginTransaction();
s.persist( p );
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
p = (WealthyPerson) s.get( WealthyPerson.class, p.id );
assertNotNull( p );
assertNotNull( p.address );
assertEquals( "Springfield", p.address.city );
assertNotNull( p.address.country );
assertEquals( "DM", p.address.country.getIso2() );
assertNotNull( p.bornIn );
assertEquals( "US", p.bornIn.getIso2() );
tx.commit();
s.close();
}
// make sure we support collection of embeddable objects inside embeddable objects
@Test
public void testEmbeddableInsideEmbeddable() throws Exception {
Session s;
Transaction tx;
Collection<URLFavorite> urls = new ArrayList<URLFavorite>();
URLFavorite urlFavorite = new URLFavorite();
urlFavorite.setUrl( "http://highscalability.com/" );
urls.add(urlFavorite);
urlFavorite = new URLFavorite();
urlFavorite.setUrl( "http://www.jboss.org/" );
urls.add(urlFavorite);
urlFavorite = new URLFavorite();
urlFavorite.setUrl( "http://www.hibernate.org/" );
urls.add(urlFavorite);
urlFavorite = new URLFavorite();
urlFavorite.setUrl( "http://www.jgroups.org/" );
urls.add( urlFavorite );
Collection<String>ideas = new ArrayList<String>();
ideas.add( "lionheart" );
ideas.add( "xforms" );
ideas.add( "dynamic content" );
ideas.add( "http" );
InternetFavorites internetFavorites = new InternetFavorites();
internetFavorites.setLinks( urls );
internetFavorites.setIdeas( ideas );
FavoriteThings favoriteThings = new FavoriteThings();
favoriteThings.setWeb( internetFavorites );
s = openSession();
tx = s.beginTransaction();
s.persist(favoriteThings);
tx.commit();
tx = s.beginTransaction();
s.flush();
favoriteThings = (FavoriteThings) s.get( FavoriteThings.class, favoriteThings.getId() );
assertTrue( "has web", favoriteThings.getWeb() != null );
assertTrue( "has ideas", favoriteThings.getWeb().getIdeas() != null );
assertTrue( "has favorite idea 'http'",favoriteThings.getWeb().getIdeas().contains("http") );
assertTrue( "has favorite idea 'http'",favoriteThings.getWeb().getIdeas().contains("dynamic content") );
urls = favoriteThings.getWeb().getLinks();
assertTrue( "has urls", urls != null);
URLFavorite[] favs = new URLFavorite[4];
urls.toArray(favs);
assertTrue( "has http://www.hibernate.org url favorite link",
"http://www.hibernate.org/".equals( favs[0].getUrl() ) ||
"http://www.hibernate.org/".equals( favs[1].getUrl() ) ||
"http://www.hibernate.org/".equals( favs[2].getUrl() ) ||
"http://www.hibernate.org/".equals( favs[3].getUrl() ));
tx.commit();
s.close();
}
@Override
protected Class[] getAnnotatedClasses() {
return new Class[]{
Person.class,
WealthyPerson.class,
RegionalArticle.class,
AddressType.class,
VanillaSwap.class,
SpreadDeal.class,
Book.class,
InternetProvider.class,
CorpType.class,
Nationality.class,
Manager.class,
FavoriteThings.class
};
}
}