📄 bulkmanipulationtest.java
字号:
// $Id: BulkManipulationTest.java 10977 2006-12-12 23:28:04Z steve.ebersole@jboss.com $package org.hibernate.test.hql;import java.util.ArrayList;import java.util.Date;import java.util.List;import junit.framework.Test;import org.hibernate.QueryException;import org.hibernate.Transaction;import org.hibernate.classic.Session;import org.hibernate.dialect.MySQLDialect;import org.hibernate.hql.ast.HqlSqlWalker;import org.hibernate.id.IdentifierGenerator;import org.hibernate.junit.functional.FunctionalTestCase;import org.hibernate.junit.functional.FunctionalTestClassTestSuite;import org.hibernate.persister.entity.EntityPersister;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * Tests execution of bulk UPDATE/DELETE statements through the new AST parser. * * @author Steve Ebersole */public class BulkManipulationTest extends FunctionalTestCase { private static final Logger log = LoggerFactory.getLogger( BulkManipulationTest.class ); public BulkManipulationTest(String name) { super( name ); } public static Test suite() { return new FunctionalTestClassTestSuite( BulkManipulationTest.class ); } public String[] getMappings() { return new String[] { "hql/Animal.hbm.xml", "hql/Vehicle.hbm.xml", "hql/KeyManyToOneEntity.hbm.xml", "hql/Versions.hbm.xml", "hql/FooBarCopy.hbm.xml", "legacy/Multi.hbm.xml", "hql/EntityWithCrazyCompositeKey.hbm.xml", "hql/SimpleEntityWithAssociation.hbm.xml", "hql/BooleanLiteralEntity.hbm.xml" }; } // Non-exists ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public void testDeleteNonExistentEntity() { Session s = openSession(); Transaction t = s.beginTransaction(); try { s.createQuery( "delete NonExistentEntity" ).executeUpdate(); fail( "no exception thrown" ); } catch( QueryException e ) { log.debug( "Caught expected error type : " + e.getMessage() ); } t.commit(); s.close(); } public void testUpdateNonExistentEntity() { Session s = openSession(); Transaction t = s.beginTransaction(); try { s.createQuery( "update NonExistentEntity e set e.someProp = ?" ).executeUpdate(); fail( "no exception thrown" ); } catch( QueryException e ) { log.debug( "Caught expected error type : " + e.getMessage() ); } t.commit(); s.close(); } public void testTempTableGenerationIsolation() throws Throwable{ Session s = openSession(); s.beginTransaction(); Truck truck = new Truck(); truck.setVin( "123t" ); truck.setOwner( "Steve" ); s.save( truck ); // manually flush the session to ensure the insert happens s.flush(); // now issue a bulk delete against Car which should force the temp table to be // created. we need to test to ensure that this does not cause the transaction // to be committed... s.createQuery( "delete from Vehicle" ).executeUpdate(); s.getTransaction().rollback(); s.close(); s = openSession(); s.beginTransaction(); List list = s.createQuery( "from Car" ).list(); assertEquals( "temp table gen caused premature commit", 0, list.size() ); s.createQuery( "delete from Car" ).executeUpdate(); s.getTransaction().rollback(); s.close(); } // BOOLEAN HANDLING ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public void testBooleanHandling() { TestData data = new TestData(); data.prepare(); Session s = openSession(); Transaction t = s.beginTransaction(); // currently, we need the three different binds because they are different underlying types... int count = s.createQuery( "update BooleanLiteralEntity set yesNoBoolean = :b1, trueFalseBoolean = :b2, zeroOneBoolean = :b3" ) .setBoolean( "b1", true ) .setBoolean( "b2", true ) .setBoolean( "b3", true ) .executeUpdate(); assertEquals( 1, count ); BooleanLiteralEntity entity = ( BooleanLiteralEntity ) s.createQuery( "from BooleanLiteralEntity" ).uniqueResult(); assertTrue( entity.isYesNoBoolean() ); assertTrue( entity.isTrueFalseBoolean() ); assertTrue( entity.isZeroOneBoolean() ); s.clear(); count = s.createQuery( "update BooleanLiteralEntity set yesNoBoolean = true, trueFalseBoolean = true, zeroOneBoolean = true" ) .executeUpdate(); assertEquals( 1, count ); entity = ( BooleanLiteralEntity ) s.createQuery( "from BooleanLiteralEntity" ).uniqueResult(); assertTrue( entity.isYesNoBoolean() ); assertTrue( entity.isTrueFalseBoolean() ); assertTrue( entity.isZeroOneBoolean() ); t.commit(); s.close(); data.cleanup(); } // INSERTS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public void testSimpleInsert() { TestData data = new TestData(); data.prepare(); Session s = openSession(); Transaction t = s.beginTransaction(); s.createQuery( "insert into Pickup (id, vin, owner) select id, vin, owner from Car" ).executeUpdate(); t.commit(); t = s.beginTransaction(); s.createQuery( "delete Vehicle" ).executeUpdate(); t.commit(); s.close(); data.cleanup(); } public void testSimpleNativeSQLInsert() { TestData data = new TestData(); data.prepare(); Session s = openSession(); Transaction t = s.beginTransaction(); List l = s.createQuery("from Vehicle").list(); assertEquals(l.size(),4); s.createSQLQuery( "insert into PICKUP (id, vin, owner) select id, vin, owner from Car" ).executeUpdate(); l = s.createQuery("from Vehicle").list(); assertEquals(l.size(),5); t.commit(); t = s.beginTransaction(); s.createSQLQuery( "delete from TRUCK" ).executeUpdate(); l = s.createQuery("from Vehicle").list(); assertEquals(l.size(),4); Car c = (Car) s.createQuery( "from Car where owner = 'Kirsten'" ).uniqueResult(); c.setOwner("NotKirsten"); assertEquals(0,s.getNamedQuery( "native-delete-car" ).setString( 0, "Kirsten" ).executeUpdate()); assertEquals(1,s.getNamedQuery( "native-delete-car" ).setString( 0, "NotKirsten" ).executeUpdate()); assertEquals(0,s.createSQLQuery( "delete from SUV where owner = :owner" ).setString( "owner", "NotThere" ).executeUpdate()); assertEquals(1,s.createSQLQuery( "delete from SUV where owner = :owner" ).setString( "owner", "Joe" ).executeUpdate()); s.createSQLQuery( "delete from PICKUP" ).executeUpdate(); l = s.createQuery("from Vehicle").list(); assertEquals(l.size(),0); t.commit(); s.close(); data.cleanup(); } public void testInsertWithManyToOne() { TestData data = new TestData(); data.prepare(); Session s = openSession(); Transaction t = s.beginTransaction(); s.createQuery( "insert into Animal (description, bodyWeight, mother) select description, bodyWeight, mother from Human" ).executeUpdate(); t.commit(); t = s.beginTransaction(); t.commit(); s.close(); data.cleanup(); } public void testInsertWithMismatchedTypes() { TestData data = new TestData(); data.prepare(); Session s = openSession(); Transaction t = s.beginTransaction(); try { s.createQuery( "insert into Pickup (owner, vin, id) select id, vin, owner from Car" ).executeUpdate(); fail( "mismatched types did not error" ); } catch( QueryException e ) { // expected result } t.commit(); t = s.beginTransaction(); s.createQuery( "delete Vehicle" ).executeUpdate(); t.commit(); s.close(); data.cleanup(); } public void testInsertIntoSuperclassPropertiesFails() { TestData data = new TestData(); data.prepare(); Session s = openSession(); Transaction t = s.beginTransaction(); try { s.createQuery( "insert into Human (id, bodyWeight) select id, bodyWeight from Lizard" ).executeUpdate(); fail( "superclass prop insertion did not error" ); } catch( QueryException e ) { // expected result } t.commit(); t = s.beginTransaction(); s.createQuery( "delete Animal where mother is not null" ).executeUpdate(); s.createQuery( "delete Animal where father is not null" ).executeUpdate(); s.createQuery( "delete Animal" ).executeUpdate(); t.commit(); s.close(); data.cleanup(); } public void testInsertAcrossMappedJoinFails() { TestData data = new TestData(); data.prepare(); Session s = openSession(); Transaction t = s.beginTransaction(); try { s.createQuery( "insert into Joiner (name, joinedName) select vin, owner from Car" ).executeUpdate(); fail( "mapped-join insertion did not error" ); } catch( QueryException e ) { // expected result } t.commit(); t = s.beginTransaction(); s.createQuery( "delete Joiner" ).executeUpdate(); s.createQuery( "delete Vehicle" ).executeUpdate(); t.commit(); s.close(); data.cleanup(); } public void testInsertWithGeneratedId() { // Make sure the env supports bulk inserts with generated ids... EntityPersister persister = sfi().getEntityPersister( PettingZoo.class.getName() ); IdentifierGenerator generator = persister.getIdentifierGenerator(); if ( !HqlSqlWalker.supportsIdGenWithBulkInsertion( generator ) ) { return; } // create a Zoo Zoo zoo = new Zoo(); zoo.setName( "zoo" ); Session s = openSession(); Transaction t = s.beginTransaction(); s.save( zoo ); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); int count = s.createQuery( "insert into PettingZoo (name) select name from Zoo" ).executeUpdate(); t.commit(); s.close(); assertEquals( "unexpected insertion count", 1, count ); s = openSession(); t = s.beginTransaction(); PettingZoo pz = ( PettingZoo ) s.createQuery( "from PettingZoo" ).uniqueResult(); t.commit(); s.close(); assertEquals( zoo.getName(), pz.getName() ); assertTrue( zoo.getId() != pz.getId() ); s = openSession(); t = s.beginTransaction(); s.createQuery( "delete Zoo" ).executeUpdate(); t.commit(); s.close(); } public void testInsertWithGeneratedVersionAndId() { // Make sure the env supports bulk inserts with generated ids... EntityPersister persister = sfi().getEntityPersister( IntegerVersioned.class.getName() ); IdentifierGenerator generator = persister.getIdentifierGenerator(); if ( !HqlSqlWalker.supportsIdGenWithBulkInsertion( generator ) ) { return; } Session s = openSession(); Transaction t = s.beginTransaction(); IntegerVersioned entity = new IntegerVersioned( "int-vers" ); s.save( entity ); s.createQuery( "select id, name, version from IntegerVersioned" ).list(); t.commit(); s.close(); Long initialId = entity.getId(); int initialVersion = entity.getVersion(); s = openSession(); t = s.beginTransaction(); int count = s.createQuery( "insert into IntegerVersioned ( name ) select name from IntegerVersioned" ).executeUpdate(); t.commit(); s.close(); assertEquals( "unexpected insertion count", 1, count ); s = openSession(); t = s.beginTransaction(); IntegerVersioned created = ( IntegerVersioned ) s.createQuery( "from IntegerVersioned where id <> :initialId" ) .setLong( "initialId", initialId.longValue() ) .uniqueResult(); t.commit(); s.close(); assertEquals( "version was not seeded", initialVersion, created.getVersion() ); s = openSession(); t = s.beginTransaction(); s.createQuery( "delete IntegerVersioned" ).executeUpdate(); t.commit(); s.close(); } public void testInsertWithGeneratedTimestampVersion() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -