compositeelementtest.java

来自「好东西,hibernate-3.2.0,他是一开元的树杖hibernate-3.」· Java 代码 · 共 133 行

JAVA
133
字号
//$Id: CompositeElementTest.java 10405 2006-09-01 18:40:39Z steve.ebersole@jboss.com $
package org.hibernate.test.compositeelement;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.HibernateException;
import org.hibernate.util.XMLHelper;
import org.hibernate.util.StringHelper;
import org.hibernate.util.CollectionHelper;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.HbmBinder;
import org.hibernate.dialect.SybaseDialect;
import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.test.TestCase;
import org.xml.sax.InputSource;
import org.dom4j.Element;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * @author Gavin King
 */
public class CompositeElementTest extends TestCase {

	public CompositeElementTest(String str) {
		super(str);
	}

	private boolean hasLengthFunction() {
		// neither support length() as a function, but each has len() which
		// is the same semantic
		return ! ( getDialect() instanceof SybaseDialect || getDialect() instanceof SQLServerDialect );
	}

	protected String[] getMappings() {
		return hasLengthFunction() ? new String[] { "compositeelement/Parent.hbm.xml" } : new String[0];
	}

	protected void configure(Configuration cfg) {
		super.configure( cfg );
		if ( !hasLengthFunction() ) {
			try {
				ClassLoader cl = Thread.currentThread().getContextClassLoader();
				InputStream xmlInputStream = cl.getResourceAsStream( getBaseForMappings() + "compositeelement/Parent.hbm.xml" );
				XMLHelper xmlHelper = new XMLHelper();
				ArrayList errors = new ArrayList();
				org.dom4j.Document doc = xmlHelper.createSAXReader( "XML InputStream", errors, cfg.getEntityResolver() )
						.read( new InputSource( xmlInputStream ) );

				Element hmNode = doc.getRootElement();
				Iterator classNodes = hmNode.elementIterator( "class" );
				while ( classNodes.hasNext() ) {
					Element classNode = ( Element ) classNodes.next();
					if ( "Parent".equals( classNode.attributeValue( "name" ) ) ) {
						Iterator sets = classNode.elementIterator( "set" );
						while ( sets.hasNext() ) {
							Element set = ( Element ) sets.next();
							if ( "children".equals( set.attributeValue( "name" ) ) ) {
								Element component = set.element( "composite-element" );
								Iterator componentProperties = component.elementIterator( "property" );
								while ( componentProperties.hasNext() ) {
									Element property = ( Element ) componentProperties.next();
									if ( "bioLength".equals( property.attributeValue( "name" ) ) ) {
										String formula = property.attributeValue( "formula" );
										property.attribute( "formula" ).setValue( StringHelper.replace( formula, "length", "len" ) );
									}
								}
							}
						}
					}
				}

				// Whew! ;)
				HbmBinder.bindRoot( doc, cfg.createMappings(), CollectionHelper.EMPTY_MAP );
			}
			catch( Throwable t ) {
				throw new HibernateException( "Grrr" );
			}
		}
	}

	public void testHandSQL() {
		Session s = openSession();
		Transaction t = s.beginTransaction();
		Child c = new Child("Child One");
		Parent p = new Parent("Parent");
		p.getChildren().add(c);
		c.setParent(p);
		s.save(p);
		s.flush();

		p.getChildren().remove(c);
		c.setParent(null);
		s.flush();

		p.getChildren().add(c);
		c.setParent(p);
		t.commit();
		s.close();

		s = openSession();
		t = s.beginTransaction();
		s.createQuery("select distinct p from Parent p join p.children c where c.name like 'Child%'").uniqueResult();
		s.clear();
		s.createQuery("select new Child(c.name) from Parent p left outer join p.children c where c.name like 'Child%'").uniqueResult();
		s.clear();
		//s.createQuery("select c from Parent p left outer join p.children c where c.name like 'Child%'").uniqueResult(); //we really need to be able to do this!
		s.clear();
		p = (Parent) s.createQuery("from Parent p left join fetch p.children").uniqueResult();
		t.commit();
		s.close();

		s = openSession();
		t = s.beginTransaction();
		s.delete(p);
		t.commit();
		s.close();
	}



	public static Test suite() {
		return new TestSuite(CompositeElementTest.class);
	}

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?