/*
* Created on 27-Nov-2004
*
*/
package org.hibernate.tool.test.jdbc2cfg;
import java.sql.SQLException;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.JDBCMetaDataConfiguration;
import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.ReverseEngineeringSettings;
import org.hibernate.Session;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.KeyValue;
import org.hibernate.mapping.OneToMany;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.Set;
import org.hibernate.tool.JDBCMetaDataBinderTestCase;
/**
* @author max
*
*/
public class PersistentClassesTest extends JDBCMetaDataBinderTestCase {
private static final String PACKAGE_NAME = "org.hibernate.tool.test.jdbc2cfg";
protected String[] getCreateSQL() {
return new String[] {
"create table orders ( id numeric(10,0) not null, name varchar(20), primary key (id) )",
"create table item ( child_id numeric(10,0) not null, name varchar(50), order_id numeric(10,0), related_order_id numeric(10,0), primary key (child_id), foreign key (order_id) references orders(id), foreign key (related_order_id) references orders(id) )"
};
}
protected void configure(JDBCMetaDataConfiguration cfgToConfigure) {
DefaultReverseEngineeringStrategy c = new DefaultReverseEngineeringStrategy();
c.setSettings(new ReverseEngineeringSettings(c).setDefaultPackageName(PACKAGE_NAME));
cfgToConfigure.setReverseEngineeringStrategy(c);
}
protected String[] getDropSQL() {
return new String[] {
"drop table item",
"drop table orders",
};
}
public void testCreatePersistentClasses() {
PersistentClass classMapping = cfg.getMetadata().getEntityBinding(toClassName("orders") );
assertNotNull("class not found", classMapping);
KeyValue identifier = classMapping.getIdentifier();
assertNotNull(identifier);
}
public void testCreateManyToOne() {
PersistentClass classMapping = cfg.getMetadata().getEntityBinding(toClassName("item") );
assertNotNull(classMapping);
KeyValue identifier = classMapping.getIdentifier();
assertNotNull(identifier);
assertEquals(3,classMapping.getPropertyClosureSpan() );
Property property = classMapping.getProperty("ordersByRelatedOrderId");
assertNotNull(property);
property = classMapping.getProperty("ordersByOrderId");
assertNotNull(property);
}
public void testCreateOneToMany() {
PersistentClass orders = cfg.getMetadata().getEntityBinding(toClassName("orders") );
Property itemset = orders.getProperty("itemsForRelatedOrderId");
Collection col = (Collection) itemset.getValue();
OneToMany otm = (OneToMany) col.getElement();
assertEquals(otm.getReferencedEntityName(), toClassName("item") );
assertEquals(otm.getAssociatedClass().getClassName(), toClassName("item") );
assertEquals(otm.getTable().getName(), identifier("orders") );
assertNotNull(itemset);
assertTrue(itemset.getValue() instanceof Set);
}
public void testBinding() throws HibernateException, SQLException {
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
Transaction t = session.beginTransaction();
Orders order = new Orders();
order.setId(new Long(1) );
order.setName("Mickey");
session.save(order);
Item item = addItem(order, 42, "item 42");
session.save(item);
session.save(addItem(order, 43, "x") );
session.save(addItem(order, 44, "y") );
session.save(addItem(order, 45, "z") );
session.save(addItem(order, 46, "w") );
t.commit();
session.close();
session = sf.openSession();
t = session.beginTransaction();
Item loadeditem = (Item) session.get(toClassName("item"),new Long(42) );
assertEquals(item.getName(),loadeditem.getName() );
assertEquals(item.getChildId(),loadeditem.getChildId() );
assertEquals(item.getOrderId().getId(),loadeditem.getOrderId().getId() );
assertTrue(loadeditem.getOrderId().getItemsForOrderId().contains(loadeditem) );
assertTrue(item.getOrderId().getItemsForOrderId().contains(item) );
assertEquals(5,item.getOrderId().getItemsForOrderId().size() );
assertEquals(5,loadeditem.getOrderId().getItemsForOrderId().size() );
t.commit();
session.close();
session = sf.openSession();
t = session.beginTransaction();
order = (Orders) session.load(Orders.class, new Long(1) );
assertFalse(Hibernate.isInitialized(order) );
assertFalse(Hibernate.isInitialized(order.getItemsForOrderId() ) );
order = (Orders) session.createQuery("from " + PACKAGE_NAME + ".Orders").getSingleResult();
assertFalse(Hibernate.isInitialized(order.getItemsForOrderId() ) );
t.commit();
session.close();
sf.close();
}
private Item addItem(Orders m, int itemid, String name) {
Item item = new Item();
item.setChildId(new Long(itemid) );
item.setOrderId(m);
item.setName(name);
m.getItemsForOrderId().add(item);
return item;
}
public static Test suite() {
return new TestSuite(PersistentClassesTest.class);
}
}