You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(22) |
Nov
(308) |
Dec
(131) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(369) |
Feb
(171) |
Mar
(236) |
Apr
(187) |
May
(218) |
Jun
(217) |
Jul
(127) |
Aug
(448) |
Sep
(270) |
Oct
(231) |
Nov
(422) |
Dec
(255) |
2004 |
Jan
(111) |
Feb
(73) |
Mar
(338) |
Apr
(351) |
May
(349) |
Jun
(495) |
Jul
(394) |
Aug
(1048) |
Sep
(499) |
Oct
(142) |
Nov
(269) |
Dec
(638) |
2005 |
Jan
(825) |
Feb
(1272) |
Mar
(593) |
Apr
(690) |
May
(950) |
Jun
(958) |
Jul
(767) |
Aug
(839) |
Sep
(525) |
Oct
(449) |
Nov
(585) |
Dec
(455) |
2006 |
Jan
(603) |
Feb
(656) |
Mar
(195) |
Apr
(114) |
May
(136) |
Jun
(100) |
Jul
(128) |
Aug
(68) |
Sep
(7) |
Oct
(1) |
Nov
(1) |
Dec
(8) |
2007 |
Jan
(4) |
Feb
(3) |
Mar
(8) |
Apr
(16) |
May
(5) |
Jun
(4) |
Jul
(6) |
Aug
(23) |
Sep
(15) |
Oct
(5) |
Nov
(7) |
Dec
(5) |
2008 |
Jan
(5) |
Feb
(1) |
Mar
(1) |
Apr
(5) |
May
(1) |
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2012 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
(1) |
Jul
(1) |
Aug
(1) |
Sep
|
Oct
(2) |
Nov
(3) |
Dec
(2) |
2013 |
Jan
(1) |
Feb
|
Mar
(2) |
Apr
(1) |
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(2) |
Jun
(1) |
Jul
|
Aug
(1) |
Sep
(1) |
Oct
|
Nov
(1) |
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2017 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
Author: epbernard Date: 2006-03-12 13:03:57 -0500 (Sun, 12 Mar 2006) New Revision: 9608 Added: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/CreditCard.java trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/User.java Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/NotNullValidator.java Log: ANN-255 exclude composite elements from NotNullValidator.apply Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/NotNullValidator.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/validator/NotNullValidator.java 2006-03-12 11:20:04 UTC (rev 9607) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/validator/NotNullValidator.java 2006-03-12 18:03:57 UTC (rev 9608) @@ -27,9 +27,11 @@ public void apply(Property property) { if ( ! ( property.getPersistentClass() instanceof SingleTableSubclass ) ) { //single table should not be forced to null - Iterator<Column> iter = (Iterator<Column>) property.getColumnIterator(); - while ( iter.hasNext() ) { - iter.next().setNullable( false ); + if ( !property.isComposite() ) { //composite should not add not-null on all columns + Iterator<Column> iter = (Iterator<Column>) property.getColumnIterator(); + while ( iter.hasNext() ) { + iter.next().setNullable( false ); + } } } } Added: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/CreditCard.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/CreditCard.java 2006-03-12 11:20:04 UTC (rev 9607) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/CreditCard.java 2006-03-12 18:03:57 UTC (rev 9608) @@ -0,0 +1,36 @@ +//$Id: $ +package org.hibernate.validator.test.haintegration; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.GeneratedValue; +import javax.persistence.Embedded; + +import org.hibernate.validator.NotNull; +import org.hibernate.validator.Valid; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class CreditCard { + @Id @GeneratedValue private Integer id; + @Embedded @Valid @NotNull private User username; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public User getUsername() { + return username; + } + + public void setUsername(User username) { + this.username = username; + } + +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java 2006-03-12 11:20:04 UTC (rev 9607) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java 2006-03-12 18:03:57 UTC (rev 9608) @@ -0,0 +1,37 @@ +//$Id: $ +package org.hibernate.validator.test.haintegration; + +import org.hibernate.test.annotations.TestCase; +import org.hibernate.validator.ClassValidator; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * @author Emmanuel Bernard + */ +public class EmbeddedObjectTest extends TestCase { + public void testNotNullEmbeddedObject() throws Exception { + CreditCard cc = new CreditCard(); + User username = new User(); + username.setFirstname( "Emmanuel" ); + username.setMiddlename( "P" ); + username.setLastname( "Bernard" ); + cc.setUsername( username ); + ClassValidator ccValid = new ClassValidator(CreditCard.class); + assertEquals( 0, ccValid.getInvalidValues( cc ).length ); + username.setMiddlename( null ); + assertEquals( 0, ccValid.getInvalidValues( cc ).length ); + Session s = openSession(); + Transaction tx = s.beginTransaction(); + s.persist( cc ); + s.flush(); + tx.rollback(); + s.close(); + } + + protected Class[] getMappings() { + return new Class[] { + CreditCard.class + }; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/User.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/User.java 2006-03-12 11:20:04 UTC (rev 9607) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/haintegration/User.java 2006-03-12 18:03:57 UTC (rev 9608) @@ -0,0 +1,40 @@ +//$Id: $ +package org.hibernate.validator.test.haintegration; + +import javax.persistence.Embeddable; + +import org.hibernate.validator.NotNull; + +/** + * @author Emmanuel Bernard + */ +@Embeddable +public class User { + @NotNull private String firstname; + private String middlename; + @NotNull private String lastname; + + public String getFirstname() { + return firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public String getMiddlename() { + return middlename; + } + + public void setMiddlename(String middlename) { + this.middlename = middlename; + } +} |
Author: epbernard Date: 2006-03-11 20:43:12 -0500 (Sat, 11 Mar 2006) New Revision: 9606 Added: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Movie.java trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Presenter.java trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Show.java trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Tv.java trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java Log: ANN-208 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-03-11 20:42:40 UTC (rev 9605) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-03-12 01:43:12 UTC (rev 9606) @@ -9,6 +9,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -29,12 +30,12 @@ import org.hibernate.MappingException; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Property; +import org.hibernate.reflection.Filter; import org.hibernate.reflection.ReflectionManager; import org.hibernate.reflection.XClass; import org.hibernate.reflection.XMember; import org.hibernate.reflection.XMethod; import org.hibernate.reflection.XProperty; -import org.hibernate.reflection.Filter; import org.hibernate.util.IdentitySet; @@ -48,6 +49,15 @@ //TODO Define magic number private static Log log = LogFactory.getLog( ClassValidator.class ); private static final InvalidValue[] EMPTY_INVALID_VALUE_ARRAY = new InvalidValue[]{}; + private static final String DEFAULT_VALIDATOR_MESSAGE = "org.hibernate.validator.resources.DefaultValidatorMessages"; + private static final Set<Class> INDEXABLE_CLASS = new HashSet<Class>(); + + static { + INDEXABLE_CLASS.add( Integer.class ); + INDEXABLE_CLASS.add( Long.class ); + INDEXABLE_CLASS.add( String.class ); + } + private final Class<T> beanClass; private transient ResourceBundle messageBundle; private transient boolean defaultResourceBundle; @@ -58,9 +68,7 @@ private transient List<XMember> memberGetters; private transient Map<Validator, String> messages; private transient List<XMember> childGetters; - private static final String DEFAULT_VALIDATOR_MESSAGE = "org.hibernate.validator.resources.DefaultValidatorMessages"; - /** * create the validator engine for this bean type */ @@ -99,8 +107,8 @@ try { //use context class loader as a first citizen ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - if (contextClassLoader == null) { - throw new MissingResourceException("No context classloader", null, "ValidatorMessage"); + if ( contextClassLoader == null ) { + throw new MissingResourceException( "No context classloader", null, "ValidatorMessage" ); } rb = ResourceBundle.getBundle( "ValidatorMessages", @@ -108,18 +116,20 @@ contextClassLoader ); } - catch( MissingResourceException e) { - log.trace( "ResourceBundle ValidatorMessages not found in thread context classloader"); + catch (MissingResourceException e) { + log.trace( "ResourceBundle ValidatorMessages not found in thread context classloader" ); //then use the Validator Framework classloader try { rb = ResourceBundle.getBundle( - "ValidatorMessages", - Locale.getDefault(), - this.getClass().getClassLoader() + "ValidatorMessages", + Locale.getDefault(), + this.getClass().getClassLoader() ); } - catch( MissingResourceException ee) { - log.debug( "ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to " + DEFAULT_VALIDATOR_MESSAGE); + catch (MissingResourceException ee) { + log.debug( + "ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to " + DEFAULT_VALIDATOR_MESSAGE + ); //the user did not override the default ValidatorMessages rb = ResourceBundle.getBundle( DEFAULT_VALIDATOR_MESSAGE ); } @@ -138,30 +148,30 @@ messages = new HashMap<Validator, String>(); childGetters = new ArrayList<XMember>(); + //build the class hierarchy to look for members in childClassValidators.put( xClass, this ); Collection<XClass> classes = new HashSet<XClass>(); addSuperClassesAndInterfaces( xClass, classes ); - for (XClass currentClass : classes) { + for ( XClass currentClass : classes ) { Annotation[] classAnnotations = currentClass.getAnnotations(); for ( int i = 0; i < classAnnotations.length ; i++ ) { Annotation classAnnotation = classAnnotations[i]; Validator beanValidator = createValidator( classAnnotation ); if ( beanValidator != null ) beanValidators.add( beanValidator ); } - }; - //build the class hierarchy to look for members in + } + ; - //Check on all selected classes for ( XClass currClass : classes ) { List<XMethod> methods = currClass.getDeclaredMethods(); - for (XMethod method : methods) { + for ( XMethod method : methods ) { createMemberValidator( method ); - createChildValidator( resourceBundle, method, method.getType() ); + createChildValidator( resourceBundle, method ); } - List<XProperty> fields = currClass.getDeclaredProperties("field", new Filter() { - + List<XProperty> fields = currClass.getDeclaredProperties( + "field", new Filter() { public boolean returnStatic() { return true; } @@ -169,12 +179,14 @@ public boolean returnTransient() { return true; } - } ); + } + ); for ( XProperty field : fields ) { - if( !field.isTypeResolved() ) - throw new IllegalStateException( "Couldn't bind the type of property field " + field ); + if ( !field.isTypeResolved() ) { + throw new IllegalStateException( "Couldn't bind the type of property field " + field ); + } createMemberValidator( field ); - createChildValidator( resourceBundle, field, field.getType() ); + createChildValidator( resourceBundle, field ); } } } @@ -183,21 +195,24 @@ for ( XClass currClass = clazz; currClass != null ; currClass = currClass.getSuperclass() ) { if ( ! classes.add( currClass ) ) return; XClass[] interfaces = currClass.getInterfaces(); - for (XClass interf : interfaces) { + for ( XClass interf : interfaces ) { addSuperClassesAndInterfaces( interf, classes ); } } } @SuppressWarnings("unchecked") - private void createChildValidator(ResourceBundle resourceBundle, XMember member, XClass clazz) { + private void createChildValidator(ResourceBundle resourceBundle, XMember member) { if ( member.isAnnotationPresent( Valid.class ) ) { setAccessible( member ); childGetters.add( member ); - //if ( Iterable.class.isAssignableFrom(clazz) || Map.class.isAssignableFrom(clazz) ) { - - // } - // else + XClass clazz; + if ( member.isCollection() || member.isArray() ) { + clazz = member.getElementClass(); + } + else { + clazz = member.getType(); + } if ( !childClassValidators.containsKey( clazz ) ) { new ClassValidator( clazz, resourceBundle, childClassValidators ); } @@ -284,7 +299,7 @@ for ( int i = 0; i < memberValidators.size() ; i++ ) { XMember getter = memberGetters.get( i ); - if ( Hibernate.isPropertyInitialized(bean, getPropertyName( getter ) ) ) { + if ( Hibernate.isPropertyInitialized( bean, getPropertyName( getter ) ) ) { Object value = getMemberValue( bean, getter ); Validator validator = memberValidators.get( i ); if ( !validator.isValid( value ) ) { @@ -296,16 +311,72 @@ for ( int i = 0; i < childGetters.size() ; i++ ) { XMember getter = childGetters.get( i ); - if ( Hibernate.isPropertyInitialized(bean, getPropertyName( getter ) ) ) { + if ( Hibernate.isPropertyInitialized( bean, getPropertyName( getter ) ) ) { Object value = getMemberValue( bean, getter ); if ( value != null && Hibernate.isInitialized( value ) ) { String propertyName = getPropertyName( getter ); - InvalidValue[] invalidValues = getClassValidator( value ) - .getInvalidValues( value, circularityState ); - for ( InvalidValue invalidValue : invalidValues ) { - invalidValue.addParentBean( bean, propertyName ); - results.add( invalidValue ); + if ( getter.isCollection() ) { + int index = 0; + boolean isIterable = value instanceof Iterable; + Map map = ! isIterable ? (Map) value : null; + Iterable elements = isIterable ? + (Iterable) value : + map.keySet(); + for ( Object element : elements ) { + Object actualElement = isIterable ? element : map.get( element ); + if (actualElement == null) { + index++; + continue; + } + InvalidValue[] invalidValues = getClassValidator( actualElement ) + .getInvalidValues( actualElement, circularityState ); + + String indexedPropName = MessageFormat.format( + "{0}[{1}]", + propertyName, + INDEXABLE_CLASS.contains( element.getClass() ) ? + ("'" + element + "'") : + index + ); + index++; + + for ( InvalidValue invalidValue : invalidValues ) { + invalidValue.addParentBean( bean, indexedPropName ); + results.add( invalidValue ); + } + } } + if ( getter.isArray() ) { + int index = 0; + for ( Object element : (Object[]) value ) { + if (element == null) { + index++; + continue; + } + InvalidValue[] invalidValues = getClassValidator( element ) + .getInvalidValues( element, circularityState ); + + String indexedPropName = MessageFormat.format( + "{0}[{1}]", + propertyName, + index + ); + index++; + + for ( InvalidValue invalidValue : invalidValues ) { + invalidValue.addParentBean( bean, indexedPropName ); + results.add( invalidValue ); + } + } + } + else { + InvalidValue[] invalidValues = getClassValidator( value ) + .getInvalidValues( value, circularityState ); + for ( InvalidValue invalidValue : invalidValues ) { + invalidValue.addParentBean( bean, propertyName ); + results.add( invalidValue ); + } + } } } } @@ -485,8 +556,11 @@ ResourceBundle rb = messageBundle; if ( rb != null && ! ( rb instanceof Serializable ) ) { messageBundle = null; - if ( ! defaultResourceBundle ) - log.warn( "Serializing a ClassValidator with a not serializable ResourceBundle: ResourceBundle ignored" ); + if ( ! defaultResourceBundle ) { + log.warn( + "Serializing a ClassValidator with a not serializable ResourceBundle: ResourceBundle ignored" + ); + } } oos.defaultWriteObject(); oos.writeObject( messageBundle ); @@ -496,7 +570,7 @@ private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { ois.defaultReadObject(); ResourceBundle rb = (ResourceBundle) ois.readObject(); - if (rb == null) rb = getDefaultResourceBundle(); + if ( rb == null ) rb = getDefaultResourceBundle(); initValidator( ReflectionManager.INSTANCE.toXClass( beanClass ), new HashMap<XClass, ClassValidator>(), rb ); } } Added: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Movie.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Movie.java 2006-03-11 20:42:40 UTC (rev 9605) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Movie.java 2006-03-12 01:43:12 UTC (rev 9606) @@ -0,0 +1,12 @@ +//$Id: $ +package org.hibernate.validator.test.collections; + +import org.hibernate.validator.NotNull; + +/** + * @author Emmanuel Bernard + */ +public class Movie { + @NotNull + public String name; +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Presenter.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Presenter.java 2006-03-11 20:42:40 UTC (rev 9605) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Presenter.java 2006-03-12 01:43:12 UTC (rev 9606) @@ -0,0 +1,12 @@ +//$Id: $ +package org.hibernate.validator.test.collections; + +import org.hibernate.validator.NotNull; + +/** + * @author Emmanuel Bernard + */ +public class Presenter { + @NotNull + public String name; +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Show.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Show.java 2006-03-11 20:42:40 UTC (rev 9605) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Show.java 2006-03-12 01:43:12 UTC (rev 9606) @@ -0,0 +1,12 @@ +//$Id: $ +package org.hibernate.validator.test.collections; + +import org.hibernate.validator.NotNull; + +/** + * @author Emmanuel Bernard + */ +public class Show { + @NotNull + public String name; +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Tv.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Tv.java 2006-03-11 20:42:40 UTC (rev 9605) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/Tv.java 2006-03-12 01:43:12 UTC (rev 9606) @@ -0,0 +1,26 @@ +//$Id: $ +package org.hibernate.validator.test.collections; + +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.HashMap; + +import org.hibernate.validator.NotNull; +import org.hibernate.validator.Valid; + +/** + * @author Emmanuel Bernard + */ +public class Tv { + @NotNull + public String name; + + @Valid + public List<Presenter> presenters = new ArrayList<Presenter>(); + + @Valid + public Map<String, Show> shows = new HashMap<String, Show>(); + + public @Valid Movie[] movies; +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java 2006-03-11 20:42:40 UTC (rev 9605) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java 2006-03-12 01:43:12 UTC (rev 9606) @@ -0,0 +1,59 @@ +//$Id: $ +package org.hibernate.validator.test.collections; + +import org.hibernate.validator.ClassValidator; +import org.hibernate.validator.InvalidValue; +import junit.framework.TestCase; + +/** + * @author Emmanuel Bernard + */ +public class ValidationCollectionTest extends TestCase { + public void testCollection() throws Exception { + Tv tv = new Tv(); + tv.name = "France 2"; + Presenter presNok = new Presenter(); + presNok.name = null; + Presenter presOk = new Presenter(); + presOk.name = "Thierry Ardisson"; + tv.presenters.add(presOk); + tv.presenters.add( presNok ); + ClassValidator validator = new ClassValidator(Tv.class); + InvalidValue[] values = validator.getInvalidValues( tv ); + assertEquals( 1, values.length ); + assertEquals( "presenters[1].name", values[0].getPropertyPath() ); + } + + public void testMap() throws Exception { + Tv tv = new Tv(); + tv.name = "France 2"; + Show showOk = new Show(); + showOk.name = "Tout le monde en parle"; + Show showNok = new Show(); + showNok.name = null; + tv.shows.put("Midnight", showOk); + tv.shows.put("Primetime", showNok); + ClassValidator validator = new ClassValidator(Tv.class); + InvalidValue[] values = validator.getInvalidValues( tv ); + assertEquals( 1, values.length ); + assertEquals( "shows['Primetime'].name", values[0].getPropertyPath() ); + } + + public void testArray() throws Exception { + Tv tv = new Tv(); + tv.name = "France 2"; + Movie movieOk = new Movie(); + movieOk.name = "Kill Bill"; + Movie movieNok = new Movie(); + movieNok.name = null; + tv.movies = new Movie[] { + movieOk, + null, + movieNok + }; + ClassValidator validator = new ClassValidator(Tv.class); + InvalidValue[] values = validator.getInvalidValues( tv ); + assertEquals( 1, values.length ); + assertEquals( "movies[2].name", values[0].getPropertyPath() ); + } +} |
From: <hib...@li...> - 2006-03-11 20:42:59
|
Author: epbernard Date: 2006-03-11 15:42:40 -0500 (Sat, 11 Mar 2006) New Revision: 9605 Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/User.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/UserPK.java Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java Log: ANN-257 tests Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java 2006-03-11 20:27:05 UTC (rev 9604) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java 2006-03-11 20:42:40 UTC (rev 9605) @@ -0,0 +1,47 @@ +package org.hibernate.test.annotations.manytoone; + +import java.util.Date; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinColumns; +import javax.persistence.ManyToOne; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; + +@Entity +@Table(name = "CLRUS2DI") +@SequenceGenerator(name = "DistrictUserSeq", sequenceName = "SQ_DISTRICT_USER") +public class DistrictUser { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DistrictUserSeq") + @Column(name = "CLRUS2DI_KEY") + private Long id; + + @Column(name = "CLRUS2DI_CREATE_USERS_KEY") + private Long createdBy; + + @Column(name = "CLRUS2DI_CREATE_DATE") + private Date createdOn; + + //@ManyToOne(cascade = CascadeType.ALL) + //@JoinColumn(name = "CLRUS2DI_DISTR_KEY") + //private District district; + + @ManyToOne(cascade = CascadeType.ALL) + @JoinColumns( { @JoinColumn(name = "CLRUS2DI_USERS_KEY", referencedColumnName="CTVUSERS_KEY"), + @JoinColumn(name = "CLRUS2DI_BEGIN_DATE", referencedColumnName="CTVUSERS_START_DATE"), + @JoinColumn(name = "CLRUS2DI_END_DATE", referencedColumnName="CTVUSERS_END_DATE") }) + private User user; + + @Column(name = "CLRUS2DI_LDTMD_KEY") + private Long ldtmd; + + @Column(name = "CLRUS2DI_PMTMP_KEY") + private Long pmtmp; +} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java 2006-03-11 20:27:05 UTC (rev 9604) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java 2006-03-11 20:42:40 UTC (rev 9605) @@ -237,22 +237,28 @@ s.close(); } + public void testManyToOneAndIdClass() throws Exception { + + } + /** * @see org.hibernate.test.annotations.TestCase#getMappings() */ - protected Class[] getMappings() { - return new Class[] { - Car.class, - Color.class, - Flight.class, - Company.class, - Customer.class, - Discount.class, - Ticket.class, - Passport.class, - Parent.class, - Child.class, - Node.class + protected java.lang.Class[] getMappings() { + return new java.lang.Class[] { + Car.class, + Color.class, + Flight.class, + Company.class, + Customer.class, + Discount.class, + Ticket.class, + Passport.class, + Parent.class, + Child.class, + Node.class, + User.class, + DistrictUser.class }; } Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/User.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/User.java 2006-03-11 20:27:05 UTC (rev 9604) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/User.java 2006-03-11 20:42:40 UTC (rev 9605) @@ -0,0 +1,113 @@ +package org.hibernate.test.annotations.manytoone; + +import java.util.Date; +import java.util.Set; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.IdClass; +import javax.persistence.OneToMany; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; + +@Entity +@Table(name = "CTVUSERS") +@IdClass(UserPK.class) +@SequenceGenerator(name = "UserSeq", sequenceName = "SQ_USER") +public class User { + @Id + @Column(name = "CTVUSERS_KEY") + private Long userKey; + + @Id + @Column(name = "CTVUSERS_START_DATE") + private Date startDate; + + @Id + @Column(name = "CTVUSERS_END_DATE") + private Date endDate; + + @Column(name = "CTVUSERS_CREATE_USERS_KEY") + private Long createdBy; + + @Column(name = "CTVUSERS_CREATE_DATE") + private Date createdOn; + + @Column(name = "CTVUSERS_ID") + private String userId; + + @Column(name = "CTVUSERS_PREFX_KEY") + private Integer prefix; + + @Column(name = "CTVUSERS_FIRST_NAME") + private String firstName; + + @Column(name = "CTVUSERS_LAST_NAME1") + private String lastName1; + + @Column(name = "CTVUSERS_LAST_NAME2") + private String lastName2; + + @Column(name = "CTVUSERS_MIDDLE_NAME1") + private String middleName1; + + @Column(name = "CTVUSERS_MIDDLE_NAME2") + private String middleName2; + + @Column(name = "CTVUSERS_SUFFX_KEY") + private Integer suffix; + + @Column(name = "CTVUSERS_BIRTH_DATE") + private Date birthDate; + + @Column(name = "CTVUSERS_BIRTH_STATE_KEY") + private Integer birthState; + + @Column(name = "CTVUSERS_BIRTH_CNTRY_KEY") + private Integer birthCountry; + + @Column(name = "CTVUSERS_USERNAME") + private String username; + + @Column(name = "CTVUSERS_PASSWORD") + private String password; + + @Column(name = "CTVUSERS_LOTYP_KEY") + private Integer userType; + + @Column(name = "CTVUSERS_PRIVL_KEY") + private Integer privilege; + + @Column(name = "CTVUSERS_STATE_KEY") + private Integer state; + + @Column(name = "CTVUSERS_CNTRY_KEY") + private Integer country; + + @Column(name = "CTVUSERS_PREFERRED_NAME") + private String preferredName; + + @Column(name = "CTVUSERS_BIRTH_PLACE") + private String birthPlace; + + @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user") + private Set<DistrictUser> districtUsers; + + @Column(name = "CTVUSERS_SCHOL_KEY") + private Long school; + + @Column(name = "CTVUSERS_CLSTR_KEY") + private Long cluster; + + @Column(name = "CTVUSERS_LDTMM_KEY") + private Long ldtmm; + + @Column(name = "CTVUSERS_LDTMD_KEY") + private Long ldtmd; + + @Column(name = "CTVUSERS_PMTMP_KEY") + private Long pmtmp; + +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/UserPK.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/UserPK.java 2006-03-11 20:27:05 UTC (rev 9604) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytoone/UserPK.java 2006-03-11 20:42:40 UTC (rev 9605) @@ -0,0 +1,37 @@ +package org.hibernate.test.annotations.manytoone; + +import java.io.Serializable; +import java.text.SimpleDateFormat; +import java.util.Date; +import javax.persistence.Column; + +public class UserPK implements Serializable { + private static final long serialVersionUID = -7720874756224520523L; + @Column(name = "CTVUSERS_KEY") + public Long userKey; + + @Column(name = "CTVUSERS_START_DATE") + public Date startDate; + + + @Column(name = "CTVUSERS_END_DATE") + public Date endDate; + + public UserPK() { + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof UserPK)) + return false; + UserPK userPK = (UserPK) obj; + SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); + return userKey.equals(userPK.userKey) && formatter.format(startDate).equals(formatter.format(userPK.startDate)) + && formatter.format(endDate).equals(formatter.format(userPK.endDate)); + } + + @Override + public int hashCode() { + return userKey.hashCode() * startDate.hashCode() * endDate.hashCode(); + } +} |
From: <hib...@li...> - 2006-03-11 20:27:40
|
Author: epbernard Date: 2006-03-11 15:27:05 -0500 (Sat, 11 Mar 2006) New Revision: 9604 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java Log: ANN-282 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-11 19:13:47 UTC (rev 9603) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-11 20:27:05 UTC (rev 9604) @@ -604,7 +604,7 @@ propertyAccessor, entityBinder, null, true, - mappings + false, mappings ); inferredData = new PropertyPreloadedData( propertyAccessor, "_identifierMapper", compositeClass @@ -615,8 +615,8 @@ propertyAnnotated, propertyAccessor, false, entityBinder, - true, - mappings, true + true, true, + mappings ); persistentClass.setIdentifierMapper( mapper ); Property property = new Property(); @@ -716,7 +716,7 @@ } } Boolean isPropertyAnnotated = isExplicitPropertyAnnotated == null ? - isPropertyAnnotated = Boolean.TRUE : //default to property and fallback if needed + Boolean.TRUE : //default to property and fallback if needed isExplicitPropertyAnnotated; String accessType = explicitAccessType != null ? explicitAccessType : "property"; @@ -1064,7 +1064,7 @@ propertyAccessor, entityBinder, typeAnn, false, - mappings + isIdentifierMapper, mappings ); if ( log.isDebugEnabled() ) { log.debug( @@ -1407,8 +1407,9 @@ ExtendedMappings mappings, boolean isComponentEmbedded ) { Component comp = fillComponent( - propertyHolder, inferredData, propertyAnnotated, propertyAccessor, true, entityBinder, isIdentifierMapper, - mappings, isComponentEmbedded + propertyHolder, inferredData, propertyAnnotated, propertyAccessor, true, entityBinder, + isComponentEmbedded, isIdentifierMapper, + mappings ); PropertyBinder binder = new PropertyBinder(); @@ -1423,8 +1424,7 @@ PropertyHolder propertyHolder, PropertyData inferredData, boolean propertyAnnotated, String propertyAccessor, boolean isNullable, EntityBinder entityBinder, - boolean isIdentifierMapper, ExtendedMappings mappings, - boolean isComponentEmbedded + boolean isComponentEmbedded, boolean isIdentifierMapper, ExtendedMappings mappings ) { Component comp = new Component( propertyHolder.getPersistentClass() ); comp.setEmbedded( isComponentEmbedded ); @@ -1480,7 +1480,7 @@ boolean isComposite, boolean isPropertyAnnotated, String propertyAccessor, EntityBinder entityBinder, Type typeAnn, boolean isEmbedded, - ExtendedMappings mappings + boolean isIdentifierMapper, ExtendedMappings mappings ) { /* * Fill simple value and property since and Id is a property @@ -1497,8 +1497,8 @@ SimpleValue id; if ( isComposite ) { id = fillComponent( - propertyHolder, inferredData, isPropertyAnnotated, propertyAccessor, false, entityBinder, false, mappings, - false + propertyHolder, inferredData, isPropertyAnnotated, propertyAccessor, + false, entityBinder, isEmbedded, isIdentifierMapper, mappings ); ( (Component) id ).setKey( true ); if ( ! id.getColumnIterator().hasNext() ) { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-03-11 19:13:47 UTC (rev 9603) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-03-11 20:27:05 UTC (rev 9604) @@ -833,8 +833,8 @@ //TODO be smart with isNullable Component component = AnnotationBinder.fillComponent( holder, inferredData, isPropertyAnnotated, isPropertyAnnotated ? "property" : "field", true, - entityBinder, false, - mappings, false + entityBinder, false, false, + mappings ); collValue.setElement( component ); } |
From: <hib...@li...> - 2006-03-11 19:14:09
|
Author: epbernard Date: 2006-03-11 14:13:47 -0500 (Sat, 11 Mar 2006) New Revision: 9603 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java Log: ANN-258 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-11 18:52:32 UTC (rev 9602) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-11 19:13:47 UTC (rev 9603) @@ -1600,8 +1600,12 @@ //value.createForeignKey(); String path = propertyHolder.getPath() + "." + propertyName; - mappings.addSecondPass( new FkSecondPass( value, columns, unique, path, mappings ) ); - + mappings.addSecondPass( + new FkSecondPass( + value, columns, + !optional && unique, //cannot have nullabe and unique on certain DBs + path, mappings ) + ); Ejb3Column.checkPropertyConsistency( columns, propertyHolder.getEntityName() + propertyName ); PropertyBinder binder = new PropertyBinder(); binder.setName( propertyName ); |
From: <hib...@li...> - 2006-03-11 18:53:08
|
Author: epbernard Date: 2006-03-11 13:52:32 -0500 (Sat, 11 Mar 2006) New Revision: 9602 Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/Truck.java Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/IndexTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/Vehicule.java Log: More test for ANN-207 Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/IndexTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/IndexTest.java 2006-03-11 18:17:43 UTC (rev 9601) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/IndexTest.java 2006-03-11 18:52:32 UTC (rev 9602) @@ -1,6 +1,8 @@ //$Id$ package org.hibernate.test.annotations.various; +import java.util.Date; + import org.hibernate.test.annotations.TestCase; import org.hibernate.Session; @@ -26,10 +28,36 @@ s.close(); } + public void testIndexAndJoined() throws Exception { + Session s = openSession(); + s.getTransaction().begin(); + Conductor cond = new Conductor(); + cond.setName( "Bob" ); + s.persist( cond ); + ProfessionalAgreement agreement = new ProfessionalAgreement(); + agreement.setExpirationDate( new Date() ); + s.persist( agreement ); + Truck truck = new Truck(); + truck.setAgreement( agreement ); + truck.setWeight( 20 ); + truck.setRegistrationNumber( "2003424" ); + truck.setYear( 2005 ); + truck.setCurrentConductor( cond ); + s.persist( truck ); + s.flush(); + s.delete( truck ); + s.delete( agreement ); + s.delete( cond ); + s.getTransaction().rollback(); + s.close(); + } + protected Class[] getMappings() { return new Class[] { Conductor.class, - Vehicule.class + Vehicule.class, + ProfessionalAgreement.class, + Truck.class }; } } Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java 2006-03-11 18:17:43 UTC (rev 9601) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java 2006-03-11 18:52:32 UTC (rev 9602) @@ -0,0 +1,32 @@ +//$Id: $ +package org.hibernate.test.annotations.various; + +import java.util.Date; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.GeneratedValue; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class ProfessionalAgreement { + @Id @GeneratedValue private Integer id; + private Date expirationDate; + + public Date getExpirationDate() { + return expirationDate; + } + + public void setExpirationDate(Date expirationDate) { + this.expirationDate = expirationDate; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/Truck.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/Truck.java 2006-03-11 18:17:43 UTC (rev 9601) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/Truck.java 2006-03-11 18:52:32 UTC (rev 9602) @@ -0,0 +1,39 @@ +//$Id: $ +package org.hibernate.test.annotations.various; + +import javax.persistence.ManyToOne; +import javax.persistence.JoinColumn; +import javax.persistence.Entity; + +import org.hibernate.annotations.Index; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class Truck extends Vehicule { + @Index(name="weigth_idx") + private int weight; + + @ManyToOne + @JoinColumn(name="agreement_id") + @Index(name="agreement_idx") + private ProfessionalAgreement agreement; + + public int getWeight() { + return weight; + } + + public void setWeight(int weight) { + this.weight = weight; + } + + public ProfessionalAgreement getAgreement() { + return agreement; + } + + public void setAgreement(ProfessionalAgreement agreement) { + this.agreement = agreement; + } + +} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/Vehicule.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/Vehicule.java 2006-03-11 18:17:43 UTC (rev 9601) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/Vehicule.java 2006-03-11 18:52:32 UTC (rev 9602) @@ -7,6 +7,8 @@ import javax.persistence.JoinColumn; import javax.persistence.Column; import javax.persistence.GeneratedValue; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Index; @@ -15,6 +17,7 @@ * @author Emmanuel Bernard */ @Entity +@Inheritance(strategy = InheritanceType.JOINED) @org.hibernate.annotations.Table(name="Vehicule", indexes = { @Index(name="improbableindex", columnNames={"registration", "Conductor_fk"} ), |
Author: epbernard Date: 2006-03-11 13:17:43 -0500 (Sat, 11 Mar 2006) New Revision: 9601 Added: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java Modified: trunk/Hibernate3/src/org/hibernate/transaction/JTATransaction.java trunk/Hibernate3/src/org/hibernate/transaction/JTATransactionFactory.java trunk/HibernateExt/ejb/lib/ejb3-persistence.jar trunk/HibernateExt/ejb/lib/hibernate-annotations.jar trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/QueryImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java trunk/HibernateExt/metadata/lib/ejb3-persistence.jar Log: EJB-125 EJB-145 Modified: trunk/Hibernate3/src/org/hibernate/transaction/JTATransaction.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/transaction/JTATransaction.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/Hibernate3/src/org/hibernate/transaction/JTATransaction.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -333,7 +333,7 @@ } } - /*package*/ UserTransaction getUserTransaction() { + protected UserTransaction getUserTransaction() { return ut; } } Modified: trunk/Hibernate3/src/org/hibernate/transaction/JTATransactionFactory.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/transaction/JTATransactionFactory.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/Hibernate3/src/org/hibernate/transaction/JTATransactionFactory.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -30,8 +30,8 @@ private static final Log log = LogFactory.getLog(JTATransactionFactory.class); private static final String DEFAULT_USER_TRANSACTION_NAME = "java:comp/UserTransaction"; - private InitialContext context; - private String utName; + protected InitialContext context; + protected String utName; public void configure(Properties props) throws HibernateException { try { Modified: trunk/HibernateExt/ejb/lib/ejb3-persistence.jar =================================================================== (Binary files differ) Modified: trunk/HibernateExt/ejb/lib/hibernate-annotations.jar =================================================================== (Binary files differ) Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -36,6 +36,7 @@ import org.hibernate.Session; import org.hibernate.StaleObjectStateException; import org.hibernate.UnresolvableObjectException; +import org.hibernate.ejb.transaction.JoinableJTATransaction; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.engine.SessionImplementor; import org.hibernate.proxy.HibernateProxy; @@ -47,58 +48,54 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManagerImplementor, Serializable { private static Log log = LogFactory.getLog( AbstractEntityManagerImpl.class ); - public static enum JoinStatus { - NOT_JOINED, - MARKED_FOR_JOINED, - JOINED - } - protected transient TransactionImpl tx = new TransactionImpl( this ); protected PersistenceContextType persistenceContextType; private FlushModeType flushMode = FlushModeType.AUTO; private PersistenceUnitTransactionType transactionType; - private JoinStatus joinStatus; protected AbstractEntityManagerImpl(PersistenceContextType type, PersistenceUnitTransactionType transactionType) { this.persistenceContextType = type; this.transactionType = transactionType; - if (PersistenceContextType.TRANSACTION == type) { + } - } + protected void postInit() { + //register in Sync if needed + getSession().getTransaction(); // joinable transaction needs to initialize if possible + getSession().isOpen(); //to register transaction } public Query createQuery(String ejbqlString) { - adjustFlushMode(); + //adjustFlushMode(); return new QueryImpl( getSession().createQuery( ejbqlString ), this ); } public Query createNamedQuery(String name) { - adjustFlushMode(); + //adjustFlushMode(); return new QueryImpl( getSession().getNamedQuery( name ), this ); } public Query createNativeQuery(String sqlString) { - adjustFlushMode(); + //adjustFlushMode(); SQLQuery q = getSession().createSQLQuery( sqlString ); return new QueryImpl( q, this ); } public Query createNativeQuery(String sqlString, Class resultClass) { - adjustFlushMode(); + //adjustFlushMode(); SQLQuery q = getSession().createSQLQuery( sqlString ); q.addEntity( "alias1", resultClass.getName(), LockMode.READ ); return new QueryImpl( q, this ); } public Query createNativeQuery(String sqlString, String resultSetMapping) { - adjustFlushMode(); + //adjustFlushMode(); SQLQuery q = getSession().createSQLQuery( sqlString ); q.setResultSetMapping( resultSetMapping ); return new QueryImpl( q, this ); } public <T> T getReference(Class<T> entityClass, Object primaryKey) { - adjustFlushMode(); + //adjustFlushMode(); try { T rtn = (T) getSession().load( entityClass, (Serializable) primaryKey ); return rtn; @@ -116,7 +113,7 @@ } public <A> A find(Class<A> entityClass, Object primaryKey) { - adjustFlushMode(); + //adjustFlushMode(); try { A rtn = (A) getSession().get( entityClass, (Serializable) primaryKey ); return rtn; @@ -144,7 +141,7 @@ public void persist(Object entity) { checkTransactionNeeded(); - adjustFlushMode(); + //adjustFlushMode(); try { getSession().persist( entity ); } @@ -155,7 +152,7 @@ public <A> A merge(A entity) { checkTransactionNeeded(); - adjustFlushMode(); + //adjustFlushMode(); try { return (A) getSession().merge( entity ); } @@ -172,7 +169,7 @@ public void remove(Object entity) { checkTransactionNeeded(); - adjustFlushMode(); + //adjustFlushMode(); try { getSession().delete( entity ); } @@ -183,7 +180,7 @@ public void refresh(Object entity) { checkTransactionNeeded(); - adjustFlushMode(); + //adjustFlushMode(); try { getSession().refresh( entity ); } @@ -211,7 +208,7 @@ public void flush() { if ( ! isTransactionInProgress() ) throw new TransactionRequiredException( "no transaction is in progress" ); - adjustFlushMode(); + //adjustFlushMode(); getSession().flush(); } @@ -238,7 +235,7 @@ } public void clear() { - adjustFlushMode(); + //adjustFlushMode(); getSession().clear(); } @@ -250,15 +247,15 @@ else if ( mode == FlushMode.COMMIT ) { this.flushMode = FlushModeType.COMMIT; } - else if ( mode == FlushMode.NEVER ) { - if ( PersistenceContextType.EXTENDED == persistenceContextType && !isTransactionInProgress() ) { - //we are in flushMode none for EXTENDED - return flushMode; - } - else { - return null; //TODO exception? - } - } +// else if ( mode == FlushMode.NEVER ) { +// if ( PersistenceContextType.EXTENDED == persistenceContextType && !isTransactionInProgress() ) { +// //we are in flushMode none for EXTENDED +// return flushMode; +// } +// else { +// return null; //TODO exception? +// } +// } else { return null; //TODO exception? } @@ -268,7 +265,7 @@ public void lock(Object entity, LockModeType lockMode) { if ( ! isTransactionInProgress() ) throw new TransactionRequiredException( "no transaction is in progress" ); - adjustFlushMode(); + //adjustFlushMode(); if ( !contains( entity ) ) throw new IllegalArgumentException( "entity not in the persistence context" ); getSession().lock( entity, getLockMode( lockMode ) ); @@ -288,7 +285,8 @@ /** * adjust the flush mode to match the no tx / no flush behavior */ - public void adjustFlushMode() { + //remove + private void adjustFlushMode() { Session session = getSession(); boolean isTransactionActive = isTransactionInProgress(); @@ -332,14 +330,20 @@ public void joinTransaction() { //set the joined status - if (joinStatus != JoinStatus.JOINED) { - joinStatus = JoinStatus.MARKED_FOR_JOINED; + if (transactionType == PersistenceUnitTransactionType.JTA) { final Session session = getSession(); - session.isOpen(); //attach hibernate core to the tx - + JoinableJTATransaction joinableJTATransaction = (JoinableJTATransaction) session.getTransaction(); + if (joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.JOINED) return; //no-op + joinableJTATransaction.markForJoined(); + session.isOpen(); //register to the Tx + if (joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.NOT_JOINED) { + throw new TransactionRequiredException( "No active JTA transaction on joinTransaction call" ); + } + else if (joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.MARKED_FOR_JOINED) { + throw new AssertionFailure( "Transaction MARKED_FOR_JOINED after isOpen() call" ); + } //register the clear on rollback - if (joinStatus == JoinStatus.JOINED) { - session.getTransaction().registerSynchronization( new Synchronization() { + joinableJTATransaction.registerSynchronization( new Synchronization() { public void beforeCompletion() { } @@ -352,8 +356,8 @@ } } } - } ); - } + } + ); } } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -22,6 +22,7 @@ public CurrentEntityManagerImpl(SessionFactory sessionFactory, PersistenceUnitTransactionType transactionType) { super( PersistenceContextType.TRANSACTION, transactionType ); this.sessionFactory = sessionFactory; + postInit(); } public Session getSession() { Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -31,13 +31,11 @@ import javassist.bytecode.ClassFile; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.AssertionFailure; import org.hibernate.HibernateException; import org.hibernate.Interceptor; import org.hibernate.MappingException; import org.hibernate.SessionFactory; -import org.hibernate.AssertionFailure; -import org.hibernate.transaction.JTATransactionFactory; -import org.hibernate.transaction.JDBCTransactionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; @@ -49,12 +47,14 @@ import org.hibernate.ejb.packaging.JarVisitor; import org.hibernate.ejb.packaging.PersistenceMetadata; import org.hibernate.ejb.packaging.PersistenceXmlLoader; +import org.hibernate.ejb.transaction.JoinableJTATransactionFactory; import org.hibernate.ejb.util.LogHelper; import org.hibernate.engine.FilterDefinition; import org.hibernate.event.EventListeners; import org.hibernate.mapping.AuxiliaryDatabaseObject; import org.hibernate.mapping.PersistentClass; import org.hibernate.secure.JACCConfiguration; +import org.hibernate.transaction.JDBCTransactionFactory; import org.hibernate.util.CollectionHelper; import org.hibernate.util.ReflectHelper; import org.hibernate.util.StringHelper; @@ -674,7 +674,7 @@ ); boolean hasTxStrategy = StringHelper.isNotEmpty( preparedProperties.getProperty( Environment.TRANSACTION_STRATEGY ) ); if (! hasTxStrategy && transactionType == PersistenceUnitTransactionType.JTA) { - preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JTATransactionFactory.class.getName() ); + preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JoinableJTATransactionFactory.class.getName() ); } else if (! hasTxStrategy && transactionType == PersistenceUnitTransactionType.RESOURCE_LOCAL) { preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JDBCTransactionFactory.class.getName() ); Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -28,6 +28,7 @@ this.sessionFactory = sessionFactory; this.open = true; this.discardOnClose = discardOnClose; + postInit(); } public Session getSession() { Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -1,10 +1,12 @@ //$Id$ package org.hibernate.ejb; +import javax.persistence.PersistenceException; + /** * @author Emmanuel Bernard */ public interface HibernateEntityManagerImplementor extends HibernateEntityManager { boolean isTransactionInProgress(); - void adjustFlushMode(); + public PersistenceException throwPersistenceException(PersistenceException e); } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/QueryImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/QueryImpl.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/QueryImpl.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -23,7 +23,7 @@ */ public class QueryImpl implements Query, HibernateQuery { private org.hibernate.Query query; - private AbstractEntityManagerImpl em; + private HibernateEntityManagerImplementor em; public QueryImpl(org.hibernate.Query query, AbstractEntityManagerImpl em) { this.query = query; Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -31,7 +31,7 @@ if ( tx != null && tx.isActive() ) { throw new IllegalStateException( "Transaction already active" ); } - entityManager.adjustFlushMode(); + //entityManager.adjustFlushMode(); tx = getSession().beginTransaction(); } @@ -60,7 +60,7 @@ rollbackOnly = false; } //if closed and we commit, the mode should have been adjusted already - if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); + //if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); } public void rollback() { @@ -76,7 +76,7 @@ finally { rollbackOnly = false; } - if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); + //if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); } public void setRollbackOnly() { Added: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -0,0 +1,66 @@ +//$Id: $ +package org.hibernate.ejb.transaction; + +import javax.naming.InitialContext; +import javax.transaction.SystemException; + +import org.hibernate.HibernateException; +import org.hibernate.TransactionException; +import org.hibernate.jdbc.JDBCContext; +import org.hibernate.transaction.JTATransaction; +import org.hibernate.transaction.TransactionFactory; +import org.hibernate.util.JTAHelper; + +/** + * Implements a joinable transaction. Until the transaction is marked for joined, the TM.isTransactionInProgress() + * must return false + * If a + * @author Emmanuel Bernard + */ +public class JoinableJTATransaction extends JTATransaction { + private JoinStatus status; + public JoinableJTATransaction( + InitialContext context, String utName, JDBCContext jdbcContext, + TransactionFactory.Context transactionContext + ) { + super( context, utName, jdbcContext, transactionContext ); + status = JoinStatus.MARKED_FOR_JOINED; + tryJoiningTransaction(); + } + + void tryJoiningTransaction() { + if (status == JoinStatus.MARKED_FOR_JOINED) { + try { + if ( getUserTransaction() != null && JTAHelper.isInProgress( getUserTransaction().getStatus() ) ) { + status = JoinStatus.JOINED; + } + else { + status = JoinStatus.NOT_JOINED; + } + } + catch( SystemException se ) { + throw new TransactionException( "Unable to check transaction status", se ); + } + } + } + + @Override + public void begin() throws HibernateException { + super.begin(); + status = JoinStatus.JOINED; + } + + public JoinStatus getStatus() { + return status; + } + + public void markForJoined() { + if (status != JoinStatus.JOINED) status = JoinStatus.MARKED_FOR_JOINED; + } + + public static enum JoinStatus { + NOT_JOINED, + MARKED_FOR_JOINED, + JOINED + } +} Added: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java 2006-03-11 14:34:56 UTC (rev 9600) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java 2006-03-11 18:17:43 UTC (rev 9601) @@ -0,0 +1,30 @@ +//$Id: $ +package org.hibernate.ejb.transaction; + +import org.hibernate.HibernateException; +import org.hibernate.Transaction; +import org.hibernate.jdbc.JDBCContext; +import org.hibernate.transaction.JTATransactionFactory; + +/** + * A transaction is in progress if the underlying JTA tx is in progress and if the Tx is marked as + * MARKED_FOR_JOINED + * + * @author Emmanuel Bernard + */ +public class JoinableJTATransactionFactory extends JTATransactionFactory { + public Transaction createTransaction(JDBCContext jdbcContext, Context transactionContext) + throws HibernateException { + return new JoinableJTATransaction(context, utName, jdbcContext, transactionContext); + } + + @Override + public boolean isTransactionInProgress( + JDBCContext jdbcContext, Context transactionContext, Transaction transaction + ) { + if (transaction == null) return false; //should not happen though + JoinableJTATransaction joinableJTATransaction = ( (JoinableJTATransaction) transaction ); + joinableJTATransaction.tryJoiningTransaction(); + return joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.JOINED; + } +} Modified: trunk/HibernateExt/metadata/lib/ejb3-persistence.jar =================================================================== (Binary files differ) |
From: <hib...@li...> - 2006-03-11 14:35:01
|
Author: epbernard Date: 2006-03-11 09:34:56 -0500 (Sat, 11 Mar 2006) New Revision: 9600 Modified: trunk/HibernateExt/common/common-build.xml trunk/HibernateExt/metadata/build.properties.dist trunk/HibernateExt/metadata/build.xml Log: Use Hibernate 3.2 Modified: trunk/HibernateExt/common/common-build.xml =================================================================== --- trunk/HibernateExt/common/common-build.xml 2006-03-11 01:41:28 UTC (rev 9599) +++ trunk/HibernateExt/common/common-build.xml 2006-03-11 14:34:56 UTC (rev 9600) @@ -39,7 +39,7 @@ <!-- set Hibernate core related properties --> - <property name="hibernate-core.home" location="${common-build.basedir}/../../hibernate-3.1"/> + <property name="hibernate-core.home" location="${common-build.basedir}/../../hibernate-3.2"/> <property name="hibernate-core.jar" location="${hibernate-core.home}/hibernate3.jar"/> <property name="hibernate-core.lib.dir" location="${hibernate-core.home}/lib"/> <property name="hibernate-core.jdbc.dir" location="${hibernate-core.home}/lib"/> <!-- for some reason jdbc.dir is renamed to lib instead of jdbc when doing a dist of hibernate3 --> Modified: trunk/HibernateExt/metadata/build.properties.dist =================================================================== --- trunk/HibernateExt/metadata/build.properties.dist 2006-03-11 01:41:28 UTC (rev 9599) +++ trunk/HibernateExt/metadata/build.properties.dist 2006-03-11 14:34:56 UTC (rev 9600) @@ -1,4 +1,4 @@ common.dir=. src.dir=src test.dir=test -hibernate-core.home=../hibernate-3.1 \ No newline at end of file +hibernate-core.home=../hibernate-3.2 \ No newline at end of file Modified: trunk/HibernateExt/metadata/build.xml =================================================================== --- trunk/HibernateExt/metadata/build.xml 2006-03-11 01:41:28 UTC (rev 9599) +++ trunk/HibernateExt/metadata/build.xml 2006-03-11 14:34:56 UTC (rev 9600) @@ -16,7 +16,7 @@ <!-- Name of project and version, used to create filenames --> <property name="Name" value="Hibernate Annotations"/> <property name="name" value="hibernate-annotations"/> - <property name="version" value="3.1beta8"/> + <property name="version" value="3.1beta9"/> <property name="javadoc.packagenames" value="org.hibernate.*"/> <property name="jdbc.dir" value="jdbc"/> <property name="copy.test" value="true"/> |
Author: epbernard Date: 2006-03-10 20:41:28 -0500 (Fri, 10 Mar 2006) New Revision: 9599 Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/spi/PersistenceProvider.java trunk/HibernateExt/ejb/build.xml trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java trunk/HibernateExt/ejb/src/test/hibernate.properties trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java Log: EJB-143 EJB-144 EJB-142 EJB-141 Modified: trunk/HibernateExt/ejb/build.xml =================================================================== --- trunk/HibernateExt/ejb/build.xml 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/build.xml 2006-03-11 01:41:28 UTC (rev 9599) @@ -16,7 +16,7 @@ <!-- Name of project and version, used to create filenames --> <property name="Name" value="Hibernate EntityManager"/> <property name="name" value="hibernate-entitymanager"/> - <property name="version" value="3.1beta6"/> + <property name="version" value="3.1beta7"/> <property name="javadoc.packagenames" value="org.hibernate.ejb.*"/> <property name="jdbc.dir" value="jdbc"/> <property name="copy.test" value="true"/> Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -21,6 +21,8 @@ import javax.persistence.spi.PersistenceUnitTransactionType; import javax.transaction.SystemException; import javax.transaction.TransactionManager; +import javax.transaction.Synchronization; +import javax.transaction.Status; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -45,14 +47,24 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManagerImplementor, Serializable { private static Log log = LogFactory.getLog( AbstractEntityManagerImpl.class ); + public static enum JoinStatus { + NOT_JOINED, + MARKED_FOR_JOINED, + JOINED + } + protected transient TransactionImpl tx = new TransactionImpl( this ); protected PersistenceContextType persistenceContextType; private FlushModeType flushMode = FlushModeType.AUTO; private PersistenceUnitTransactionType transactionType; + private JoinStatus joinStatus; protected AbstractEntityManagerImpl(PersistenceContextType type, PersistenceUnitTransactionType transactionType) { this.persistenceContextType = type; this.transactionType = transactionType; + if (PersistenceContextType.TRANSACTION == type) { + + } } public Query createQuery(String ejbqlString) { @@ -319,7 +331,30 @@ } public void joinTransaction() { + //set the joined status + if (joinStatus != JoinStatus.JOINED) { + joinStatus = JoinStatus.MARKED_FOR_JOINED; + final Session session = getSession(); + session.isOpen(); //attach hibernate core to the tx + //register the clear on rollback + if (joinStatus == JoinStatus.JOINED) { + session.getTransaction().registerSynchronization( new Synchronization() { + + public void beforeCompletion() { + } + + public void afterCompletion(int status) { + if ( Status.STATUS_ROLLEDBACK == status + && transactionType == PersistenceUnitTransactionType.JTA) { + if ( session.isOpen() ) { + session.clear(); + } + } + } + } ); + } + } } /** Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -70,11 +70,13 @@ private AnnotationConfiguration cfg; private SettingsFactory settingsFactory; private EventListenerConfigurator listenerConfigurator; + private PersistenceUnitTransactionType transactionType; public Ejb3Configuration() { settingsFactory = new InjectionSettingsFactory(); cfg = new AnnotationConfiguration( settingsFactory ); listenerConfigurator = new EventListenerConfigurator( this ); + transactionType = PersistenceUnitTransactionType.JTA; //default as per the spec } /** @@ -106,7 +108,8 @@ } Map workingVars = new HashMap(); - workingVars.put( HibernatePersistence.TRANSACTION_TYPE, metadata.getTransactionType() ); + //workingVars.put( HibernatePersistence.TRANSACTION_TYPE, metadata.getTransactionType() ); + defineTransactionType( metadata.getTransactionType(), metadata.getName() ); if ( metadata.getClasses().size() > 0 ) { workingVars.put( HibernatePersistence.CLASS_NAMES, metadata.getClasses() ); } @@ -119,6 +122,7 @@ Properties props = new Properties(); props.putAll( metadata.getProps() ); if ( overrides != null ) props.putAll( overrides ); //yuk! + workingVars.put( HibernatePersistence.PERSISTENCE_UNIT_NAME, metadata.getName() ); return createEntityManagerFactory( props, workingVars ); } @@ -128,28 +132,24 @@ * the peristence.xml file. * * @param emName entity manager name - * @param map properties passed to the persistence provider + * @param integration properties passed to the persistence provider * @return initialized EntityManagerFactory */ - public EntityManagerFactory createEntityManagerFactory(String emName, Map map) { + public EntityManagerFactory createEntityManagerFactory(String emName, Map integration) { try { log.debug( "Trying to find persistence unit: " + emName ); - if ( map == null ) { - map = CollectionHelper.EMPTY_MAP; - } - else { - // be sure not to fuck it up - map = Collections.unmodifiableMap( map ); - } + integration = integration == null ? + integration = CollectionHelper.EMPTY_MAP : + Collections.unmodifiableMap( integration ); Enumeration<URL> xmls = Thread.currentThread() .getContextClassLoader() .getResources( "META-INF/persistence.xml" ); while ( xmls.hasMoreElements() ) { URL url = xmls.nextElement(); log.trace( "Analyse of persistence.xml: " + url ); - List<PersistenceMetadata> metadataFiles = PersistenceXmlLoader.deploy( url, map ); + List<PersistenceMetadata> metadataFiles = PersistenceXmlLoader.deploy( url, integration ); for ( PersistenceMetadata metadata : metadataFiles ) { - JarVisitor.Filter[] filters = getFilters( metadata.getProps(), map ); + JarVisitor.Filter[] filters = getFilters( metadata.getProps(), integration ); if ( metadata.getProvider() == null || IMPLEMENTATION_NAME.equalsIgnoreCase( metadata.getProvider() @@ -173,7 +173,7 @@ visitor = JarVisitor.getVisitor( jarFile, filters ); addMetadataFromVisitor( visitor, metadata ); } - return createFactory( metadata, map ); + return createFactory( metadata, integration ); } } } @@ -212,16 +212,19 @@ /** * Create a factory from a PersistenceInfo object */ - public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info) { + public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map integration) { if ( log.isDebugEnabled() ) { log.debug( "Processing " + LogHelper.logPersistenceUnitInfo( info ) ); } else { log.info( "Processing PersistenceUnitInfo [\n\tname: " + info.getPersistenceUnitName() + "\n\t...]" ); } - if ( info.getPersistenceProviderClassName() != null - && ! info.getPersistenceProviderClassName().trim().startsWith( IMPLEMENTATION_NAME ) ) { - log.info( "Required a different provider: " + info.getPersistenceProviderClassName() ); + + integration = integration != null ? Collections.unmodifiableMap(integration) : CollectionHelper.EMPTY_MAP; + String provider = (String) integration.get( HibernatePersistence.PROVIDER ); + if (provider == null) provider = info.getPersistenceProviderClassName(); + if ( provider != null && ! provider.trim().startsWith( IMPLEMENTATION_NAME ) ) { + log.info( "Required a different provider: " + provider ); return null; } if ( info.getClassLoader() == null ) { @@ -234,12 +237,20 @@ thread.setContextClassLoader( info.getClassLoader() ); } - List<String> entities = new ArrayList( 50 ); + Map workingVars = new HashMap(); + workingVars.put( HibernatePersistence.PERSISTENCE_UNIT_NAME, info.getPersistenceUnitName() ); + List<String> entities = new ArrayList<String>( 50 ); if ( info.getManagedClassNames() != null ) entities.addAll( info.getManagedClassNames() ); List<InputStream> hbmFiles = new ArrayList<InputStream>(); List<String> packages = new ArrayList<String>(); - Map workingVars = new HashMap(); - workingVars.put( HibernatePersistence.TRANSACTION_TYPE, info.getTransactionType() ); +// Object overridenTxType = integration.get( HibernatePersistence.TRANSACTION_TYPE ); +// if (overridenTxType != null) { +// defineTransactionType( overridenTxType, info.getPersistenceUnitName() ); +// } +// else { + defineTransactionType( info.getTransactionType(), info.getPersistenceUnitName() ); +// } + //workingVars.put( HibernatePersistence.TRANSACTION_TYPE, transactionType ); boolean[] detectArtifact = getDetectedArtifacts( info.getProperties(), null ); for ( URL jar : info.getJarFileUrls() ) { if ( detectArtifact[0] ) scanForClasses( jar, packages, entities ); @@ -250,32 +261,72 @@ if ( detectArtifact[1] ) scanForHbmXmlFiles( info.getPersistenceUnitRootUrl(), hbmFiles ); } - Properties props = info.getProperties() != null ? + Properties properties = info.getProperties() != null ? info.getProperties() : new Properties(); + for ( Map.Entry entry : (Set<Map.Entry>) integration.keySet() ) { + if ( entry.getKey() instanceof String && entry.getValue() instanceof String ) { + properties.setProperty( (String) entry.getKey(), (String) entry.getValue() ); + } + } //FIXME send the appropriate entites. - if ( "true".equalsIgnoreCase( props.getProperty(HibernatePersistence.USE_CLASS_ENHANCER) ) ) { + if ( "true".equalsIgnoreCase( properties.getProperty(HibernatePersistence.USE_CLASS_ENHANCER) ) ) { info.addTransformer( new InterceptFieldClassFileTransformer( entities ) ); } workingVars.put( HibernatePersistence.CLASS_NAMES, entities ); workingVars.put( HibernatePersistence.PACKAGE_NAMES, packages ); if ( hbmFiles.size() > 0 ) workingVars.put( HibernatePersistence.HBXML_FILES, hbmFiles ); - if ( info.getJtaDataSource() != null || info.getNonJtaDataSource() != null ) { + + //datasources + boolean overridenDatasource = false; + String dataSource = (String) integration.get( HibernatePersistence.JTA_DATASOURCE ); + if (dataSource != null) { + overridenDatasource = true; + properties.setProperty( Environment.DATASOURCE, dataSource ); + } + dataSource = (String) integration.get( HibernatePersistence.NON_JTA_DATASOURCE ); + if (dataSource != null) { + overridenDatasource = true; + properties.setProperty( Environment.DATASOURCE, dataSource ); + } + + if ( ! overridenDatasource && (info.getJtaDataSource() != null || info.getNonJtaDataSource() != null ) ) { this.setDataSource( info.getJtaDataSource() != null ? info.getJtaDataSource() : info.getNonJtaDataSource() ); this.setProperty( Environment.CONNECTION_PROVIDER, InjectedDataSourceConnectionProvider.class.getName() ); } - EntityManagerFactory entityManagerFactory = createEntityManagerFactory( props, workingVars ); + EntityManagerFactory entityManagerFactory = createEntityManagerFactory( properties, workingVars ); //After EMF, set the CCL back if ( ! info.getClassLoader().equals( contextClassLoader ) ) { thread.setContextClassLoader( contextClassLoader ); } return entityManagerFactory; + } + private void defineTransactionType(Object overridenTxType, String persistenceUnitName) { + if (overridenTxType == null) { + if (transactionType == null) { + transactionType = PersistenceUnitTransactionType.JTA; //this is the default value + } + } + else if (overridenTxType instanceof String) { + transactionType = PersistenceXmlLoader.getTransactionType( (String) overridenTxType ); + } + else if (overridenTxType instanceof PersistenceUnitTransactionType) { + transactionType = (PersistenceUnitTransactionType) overridenTxType; + } + else { + throw new PersistenceException( + HibernatePersistence.TRANSACTION_TYPE + " of the wrong class type" + + (persistenceUnitName != null ? " in unit " + persistenceUnitName : "") + + ": " + overridenTxType.getClass() + ); + } + } public Ejb3Configuration setProperty(String key, String value) { @@ -438,12 +489,10 @@ * Create an EntityManagerFactory <b>when</b> the configuration is ready */ public EntityManagerFactory createEntityManagerFactory() { - return createEntityManagerFactory( cfg.getProperties(), new HashMap() ); } - private EntityManagerFactory buildEntityManagerFactory(PersistenceUnitTransactionType transactionType, - boolean discardOnClose) { + private EntityManagerFactory buildEntityManagerFactory(boolean discardOnClose) { return new EntityManagerFactoryImpl( cfg.buildSessionFactory(), transactionType, @@ -571,10 +620,7 @@ log.warn( Environment.AUTOCOMMIT + " = false break the EJB3 specification" ); } boolean discardOnClose = preparedProperties.getProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE).equals( "true"); - return buildEntityManagerFactory( - (PersistenceUnitTransactionType) workingVars.get(HibernatePersistence.TRANSACTION_TYPE), - discardOnClose - ); + return buildEntityManagerFactory(discardOnClose); } private void addClassesToSessionFactory(Map workingVars) { @@ -619,20 +665,23 @@ preparedProperties.setProperty( Environment.USE_IDENTIFIER_ROLLBACK, "false" ); preparedProperties.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "true" ); preparedProperties.setProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE, "false" ); - PersistenceUnitTransactionType type = (PersistenceUnitTransactionType) - workingVars.get(HibernatePersistence.TRANSACTION_TYPE); - if (type == PersistenceUnitTransactionType.JTA) { + + //override the new defaults with the user defined ones + if ( properties != null ) preparedProperties.putAll( properties ); + defineTransactionType( + preparedProperties.getProperty( HibernatePersistence.TRANSACTION_TYPE ), + (String) workingVars.get( HibernatePersistence.PERSISTENCE_UNIT_NAME ) + ); + boolean hasTxStrategy = StringHelper.isNotEmpty( preparedProperties.getProperty( Environment.TRANSACTION_STRATEGY ) ); + if (! hasTxStrategy && transactionType == PersistenceUnitTransactionType.JTA) { preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JTATransactionFactory.class.getName() ); } - else if (type == PersistenceUnitTransactionType.RESOURCE_LOCAL) { + else if (! hasTxStrategy && transactionType == PersistenceUnitTransactionType.RESOURCE_LOCAL) { preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JDBCTransactionFactory.class.getName() ); } else { - new AssertionFailure("Unknown PersisntenceUnitTransactionType: " + type); + new AssertionFailure("Unknown PersisntenceUnitTransactionType: " + transactionType); } - - //override the new defaults with the user defined ones - if ( properties != null ) preparedProperties.putAll( properties ); return preparedProperties; } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -17,7 +17,7 @@ * Provider */ public static final String PROVIDER = "javax.persistence.provider"; - /** + /** * transaction type */ public static final String TRANSACTION_TYPE = "javax.persistence.transactionType"; @@ -92,8 +92,10 @@ public static final String JACC_CONTEXT_ID = "hibernate.jacc.ctx.id"; public static final String JACC_PREFIX = "hibernate.jacc"; public static final String JACC_ENABLED = "hibernate.jacc.enabled"; + public static final String PERSISTENCE_UNIT_NAME = "hibernate.ejb.persistenceUnitName"; + /** * Get an entity manager factory by its entity manager name and given the * appropriate extra properties. Those proeprties override the one get through @@ -108,9 +110,9 @@ return cfg.createEntityManagerFactory( persistenceUnitName, overridenProperties ); } - public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info) { + public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) { Ejb3Configuration cfg = new Ejb3Configuration(); - return cfg.createContainerEntityManagerFactory( info ); + return cfg.createContainerEntityManagerFactory( info, map ); } /** Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -10,6 +10,7 @@ /** * @author Gavin King + * @author Emmanuel Bernard */ public class TransactionImpl implements EntityTransaction { @@ -46,9 +47,18 @@ tx.commit(); } catch (Exception e) { + try { + //as per the spec we should rollback if commit fails + tx.rollback(); + } + catch (Exception re) { + //swallow + } throw new RollbackException( "Error while commiting the transaction", e); } - rollbackOnly = false; + finally { + rollbackOnly = false; + } //if closed and we commit, the mode should have been adjusted already if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); } @@ -63,7 +73,10 @@ catch (RuntimeException e) { throw new PersistenceException("unexpected error when rollbacking", e); } - entityManager.adjustFlushMode(); + finally { + rollbackOnly = false; + } + if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); } public void setRollbackOnly() { Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -6,15 +6,17 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.Properties; +import javax.persistence.PersistenceException; +import javax.persistence.spi.PersistenceUnitTransactionType; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import javax.persistence.spi.PersistenceUnitTransactionType; -import javax.persistence.PersistenceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.ejb.HibernatePersistence; import org.hibernate.util.StringHelper; -import org.hibernate.ejb.HibernatePersistence; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -81,6 +83,12 @@ if (dataSource != null) { metadata.setNonJtaDatasource( dataSource ); } + Properties properties = metadata.getProps(); + for ( Map.Entry entry : (Set<Map.Entry>) overrides.keySet() ) { + if ( entry.getKey() instanceof String && entry.getValue() instanceof String ) { + properties.setProperty( (String) entry.getKey(), (String) entry.getValue() ); + } + } units.add( metadata ); } } Modified: trunk/HibernateExt/ejb/src/test/hibernate.properties =================================================================== --- trunk/HibernateExt/ejb/src/test/hibernate.properties 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/hibernate.properties 2006-03-11 01:41:28 UTC (rev 9599) @@ -5,6 +5,7 @@ ## select Hibernate persistence provider javax.persistence.provider org.hibernate.ejb.HibernatePersistence +javax.persistence.transactionType=RESOURCE_LOCAL ## entity bean class name (comma separated) Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -1,25 +1,24 @@ //$Id$ package org.hibernate.ejb.test; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutput; +import java.io.ObjectOutputStream; import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.io.ObjectOutput; -import java.io.ObjectOutputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectInputStream; -import java.io.ByteArrayInputStream; import javax.persistence.EntityManager; -import javax.persistence.PersistenceContextType; +import javax.persistence.FlushModeType; import javax.persistence.Query; -import javax.persistence.FlushModeType; +import org.hibernate.FlushMode; +import org.hibernate.HibernateException; +import org.hibernate.QueryException; +import org.hibernate.ejb.HibernateEntityManager; import org.hibernate.ejb.HibernateEntityManagerFactory; -import org.hibernate.ejb.HibernateEntityManager; import org.hibernate.stat.Statistics; -import org.hibernate.QueryException; -import org.hibernate.HibernateException; -import org.hibernate.FlushMode; /** * @author Gavin King @@ -47,58 +46,58 @@ } - public void testEntityManager() { + // EM TRANSACTION +// public void testEntityManager() { +// +// Item item = new Item( "Mouse", "Micro$oft mouse" ); +// +// EntityManager em = factory.createEntityManager(); +// em.getTransaction().begin(); +// em.persist( item ); +// assertTrue( em.contains( item ) ); +// em.getTransaction().commit(); +// +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); +// assertNotNull( item ); +// assertEquals( "Micro$oft mouse", item.getDescr() ); +// item.setDescr( "Micro$oft wireless mouse" ); +// assertTrue( em.contains( item ) ); +// em.getTransaction().commit(); +// +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// item = (Item) em.find( Item.class, "Mouse" ); +// assertNotNull( item ); +// em.getTransaction().commit(); +// +// item = em.find( Item.class, "Mouse" ); +// assertFalse( em.contains( item ) ); +// +// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); +// assertNotNull( item ); +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// item = em.find( Item.class, "Mouse" ); +// assertNotNull( item ); +// assertTrue( em.contains( item ) ); +// assertEquals( "Micro$oft wireless mouse", item.getDescr() ); +// em.remove( item ); +// em.remove( item );//second should be a no-op +// em.getTransaction().commit(); +// +// em.close(); +// } - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = factory.createEntityManager(); - em.getTransaction().begin(); - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); - assertNotNull( item ); - assertEquals( "Micro$oft mouse", item.getDescr() ); - item.setDescr( "Micro$oft wireless mouse" ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - item = (Item) em.find( Item.class, "Mouse" ); - assertNotNull( item ); - em.getTransaction().commit(); - - item = em.find( Item.class, "Mouse" ); - assertFalse( em.contains( item ) ); - - item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); - assertNotNull( item ); - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - item = em.find( Item.class, "Mouse" ); - assertNotNull( item ); - assertTrue( em.contains( item ) ); - assertEquals( "Micro$oft wireless mouse", item.getDescr() ); - em.remove( item ); - em.remove( item );//second should be a no-op - em.getTransaction().commit(); - - em.close(); - - } - public void testExtendedEntityManager() { Item item = new Item( "Mouse", "Micro$oft mouse" ); - EntityManager em = factory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = factory.createEntityManager( ); em.getTransaction().begin(); em.persist( item ); assertTrue( em.contains( item ) ); @@ -134,6 +133,7 @@ em.getTransaction().begin(); assertTrue( em.contains( item ) ); em.remove( item ); + em.remove( item ); //Second should be no-op em.getTransaction().commit(); em.close(); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -5,18 +5,17 @@ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; -import javax.persistence.PersistenceContextType; import javax.persistence.PersistenceException; import org.hibernate.ejb.HibernateEntityManagerFactory; +import org.hibernate.ejb.test.pack.cfgxmlpar.Morito; import org.hibernate.ejb.test.pack.defaultpar.ApplicationServer; import org.hibernate.ejb.test.pack.defaultpar.Mouse; import org.hibernate.ejb.test.pack.defaultpar.Version; +import org.hibernate.ejb.test.pack.excludehbmpar.Caipirinha; import org.hibernate.ejb.test.pack.explodedpar.Carpet; import org.hibernate.ejb.test.pack.explodedpar.Elephant; import org.hibernate.ejb.test.pack.externaljar.Scooter; -import org.hibernate.ejb.test.pack.excludehbmpar.Caipirinha; -import org.hibernate.ejb.test.pack.cfgxmlpar.Morito; import org.hibernate.stat.Statistics; //$Id$ @@ -126,61 +125,61 @@ emf.close(); } - public void testEntityManager() { + //EM TRANSACTION +// public void testEntityManager() { +// +// Item item = new Item( "Mouse", "Micro$oft mouse" ); +// +// EntityManager em = factory.createEntityManager(); +// em.getTransaction().begin(); +// em.persist( item ); +// assertTrue( em.contains( item ) ); +// em.getTransaction().commit(); +// +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); +// assertNotNull( item ); +// assertEquals( "Micro$oft mouse", item.getDescr() ); +// item.setDescr( "Micro$oft wireless mouse" ); +// assertTrue( em.contains( item ) ); +// em.getTransaction().commit(); +// +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// item = (Item) em.find( Item.class, "Mouse" ); +// assertNotNull( item ); +// em.getTransaction().commit(); +// +// item = em.find( Item.class, "Mouse" ); +// assertFalse( em.contains( item ) ); +// +// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); +// assertNotNull( item ); +// assertFalse( em.contains( item ) ); +// +// em.getTransaction().begin(); +// assertEquals("Explicit package in <class> should work", 1, em.createNamedQuery( "countItems" ).getSingleResult() ); +// em.getTransaction().commit(); +// +// em.getTransaction().begin(); +// item = em.find( Item.class, "Mouse" ); +// assertNotNull( item ); +// assertTrue( em.contains( item ) ); +// assertEquals( "Micro$oft wireless mouse", item.getDescr() ); +// em.remove( item ); +// em.getTransaction().commit(); +// +// em.close(); +// } - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = factory.createEntityManager(); - em.getTransaction().begin(); - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); - assertNotNull( item ); - assertEquals( "Micro$oft mouse", item.getDescr() ); - item.setDescr( "Micro$oft wireless mouse" ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - item = (Item) em.find( Item.class, "Mouse" ); - assertNotNull( item ); - em.getTransaction().commit(); - - item = em.find( Item.class, "Mouse" ); - assertFalse( em.contains( item ) ); - - item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult(); - assertNotNull( item ); - assertFalse( em.contains( item ) ); - - em.getTransaction().begin(); - assertEquals("Explicit package in <class> should work", 1, em.createNamedQuery( "countItems" ).getSingleResult() ); - em.getTransaction().commit(); - - em.getTransaction().begin(); - item = em.find( Item.class, "Mouse" ); - assertNotNull( item ); - assertTrue( em.contains( item ) ); - assertEquals( "Micro$oft wireless mouse", item.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - - em.close(); - - } - public void testExtendedEntityManager() { Item item = new Item( "Mouse", "Micro$oft mouse" ); - EntityManager em = factory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = factory.createEntityManager( ); em.getTransaction().begin(); em.persist( item ); assertTrue( em.contains( item ) ); @@ -216,6 +215,7 @@ em.getTransaction().begin(); assertTrue( em.contains( item ) ); em.remove( item ); + em.remove( item ); //second remove should be a no-op em.getTransaction().commit(); em.close(); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -21,13 +21,13 @@ em.getTransaction().begin(); em.persist( c ); em.getTransaction().commit(); - + em.clear(); em.getTransaction().begin(); c = em.find( Cat.class, c.getId() ); assertFalse( c.getAge() == 0 ); c.setName( "Tomcat" ); //update this entity em.getTransaction().commit(); - + em.clear(); em.getTransaction().begin(); c = em.find( Cat.class, c.getId() ); assertEquals( "Tomcat", c.getName() ); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -13,7 +13,7 @@ public void testDatasourceInjection() { PersistenceUnitInfoImpl info = new PersistenceUnitInfoImpl(); try { - EntityManagerFactory emf = ( new HibernatePersistence() ).createContainerEntityManagerFactory( info ); + EntityManagerFactory emf = ( new HibernatePersistence() ).createContainerEntityManagerFactory( info, null ); fail("FakeDatasource should have been used"); } catch (FakeDataSourceException fde) { //success Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -9,7 +9,6 @@ import java.util.Date; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; -import javax.persistence.PersistenceContextType; import org.hibernate.ejb.HibernateEntityManager; import org.hibernate.ejb.test.Cat; @@ -34,7 +33,7 @@ EntityManagerFactory seriallizedFactory = (EntityManagerFactory) in.readObject(); in.close(); byteIn.close(); - EntityManager em = seriallizedFactory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = seriallizedFactory.createEntityManager( ); //em.getTransaction().begin(); //em.setFlushMode( FlushModeType.NEVER ); Cat cat = new Cat(); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -2,14 +2,13 @@ package org.hibernate.ejb.test.transaction; import javax.persistence.EntityManager; -import javax.persistence.LockModeType; -import javax.persistence.PersistenceContextType; -import javax.persistence.TransactionRequiredException; import javax.persistence.EntityNotFoundException; +import javax.persistence.LockModeType; import javax.persistence.RollbackException; +import javax.persistence.TransactionRequiredException; -import org.hibernate.ejb.test.TestCase; import org.hibernate.ejb.HibernateEntityManagerFactory; +import org.hibernate.ejb.test.TestCase; import org.hibernate.stat.Statistics; /** @@ -19,7 +18,7 @@ public void testAlwaysTransactionalOperations() throws Exception { Book book = new Book(); book.name = "Le petit prince"; - EntityManager em = factory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = factory.createEntityManager( ); em.getTransaction().begin(); em.persist( book ); em.getTransaction().commit(); @@ -42,38 +41,38 @@ em.getTransaction().commit(); } - public void testTransactionalOperationsWhenTransactional() throws Exception { - Book book = new Book(); - book.name = "Le petit prince"; - EntityManager em = factory.createEntityManager( PersistenceContextType.TRANSACTION ); - try { - em.persist( book ); - fail("flush has to be inside a Tx"); - } - catch (TransactionRequiredException e) { - //success - } - try { - em.refresh( book ); - fail("refresh has to be inside a Tx"); - } - catch (TransactionRequiredException e) { - //success - } - try { - em.remove( book ); - fail("refresh has to be inside a Tx"); - } - catch (TransactionRequiredException e) { - //success - } - em.close(); - } +// public void testTransactionalOperationsWhenTransactional() throws Exception { +// Book book = new Book(); +// book.name = "Le petit prince"; +// EntityManager em = factory.createEntityManager( PersistenceContextType.TRANSACTION ); +// try { +// em.persist( book ); +// fail("flush has to be inside a Tx"); +// } +// catch (TransactionRequiredException e) { +// //success +// } +// try { +// em.refresh( book ); +// fail("refresh has to be inside a Tx"); +// } +// catch (TransactionRequiredException e) { +// //success +// } +// try { +// em.remove( book ); +// fail("refresh has to be inside a Tx"); +// } +// catch (TransactionRequiredException e) { +// //success +// } +// em.close(); +// } public void testTransactionalOperationsWhenExtended() throws Exception { Book book = new Book(); book.name = "Le petit prince"; - EntityManager em = factory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = factory.createEntityManager( ); Statistics stats = ( ( HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics(); stats.clear(); stats.setStatisticsEnabled( true ); @@ -116,7 +115,7 @@ public void testMergeWhenExtended() throws Exception { Book book = new Book(); book.name = "Le petit prince"; - EntityManager em = factory.createEntityManager( PersistenceContextType.EXTENDED ); + EntityManager em = factory.createEntityManager( ); Statistics stats = ( ( HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics(); em.getTransaction().begin(); Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/spi/PersistenceProvider.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/spi/PersistenceProvider.java 2006-03-10 23:34:42 UTC (rev 9598) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/spi/PersistenceProvider.java 2006-03-11 01:41:28 UTC (rev 9599) @@ -18,7 +18,10 @@ * @param emName The name of the persistence unit * @param map A Map of properties for use by the * persistence provider. These properties may be used to - * override the settings in the persistence.xml. + * override the values of the corresponding elements in + * the persistence.xml file or specify values for + * properties not specified in the persistence.xml + * (and may be null if no properties are specified). * @return EntityManagerFactory for the persistence unit, * or null if the provider is not the right provider */ @@ -29,8 +32,11 @@ * is to be created. * * @param info Metadata for use by the persistence provider + * @param map A Map of integration-level properties for use + * by the persistence provider (may be null if no properties + * are specified). * @return EntityManagerFactory for the persistence unit * specified by the metadata */ - public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info); + public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map); } \ No newline at end of file |
Author: max...@jb... Date: 2006-03-10 18:34:42 -0500 (Fri, 10 Mar 2006) New Revision: 9598 Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/ConfigurationTask.java trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2CfgXmlExporterTask.java trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/HibernateConfigurationExporter.java trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/POJOExporter.java trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/seam/SeamExporter.java trunk/HibernateExt/tools/src/templates/dao/daohome.ftl trunk/HibernateExt/tools/src/test/org/hibernate/tool/ant/SeamAntTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2DaoTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2EJBDaoTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2HibernateDAOTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2JavaEjb3Test.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2JavaTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/overridetest.reveng.xml trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/schemaselection.reveng.xml trunk/HibernateExt/tools/src/test5.0/org/hibernate/tool/hbm2x/Hbm2JavaEjb3ForJDK50Test.java trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java Log: HBX-615 misc reveng changes addition. Customization of: + primarykey property name + many-to-one/set property name + key-column instead of just column in primarykey Alignment with extendability made in eclipse ui by marshall Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -47,7 +47,6 @@ import org.hibernate.type.TypeFactory; import org.hibernate.util.JoinedIterator; import org.hibernate.util.StringHelper; -import org.jgroups.util.GetNetworkInterfaces1_4; /** @@ -308,7 +307,10 @@ final TableIdentifier tableIdentifier = TableIdentifier.create(table); if (keyColumns.size()>1) { id = handleCompositeKey(rc, processed, keyColumns, mapping); - idPropertyname = "id"; + idPropertyname = revengStrategy.tableToIdentifierPropertyName(tableIdentifier); + if(idPropertyname==null) { + idPropertyname = "id"; + } } else { Column pkc = (Column) keyColumns.get(0); @@ -316,7 +318,11 @@ id = bindColumnToSimpleValue(table, pkc, mapping); - idPropertyname = revengStrategy.columnToPropertyName(tableIdentifier, pkc.getName() ); + idPropertyname = revengStrategy.tableToIdentifierPropertyName(tableIdentifier); + if(idPropertyname==null) { + idPropertyname = revengStrategy.columnToPropertyName(tableIdentifier, pkc.getName() ); + } + processed.add(pkc); } id.setIdentifierGeneratorStrategy(revengStrategy.getTableIdentifierStrategyName(tableIdentifier)); @@ -535,8 +541,13 @@ private SimpleValue handleCompositeKey(RootClass rc, Set processedColumns, List keyColumns, Mapping mapping) { Component pkc = new Component(rc); pkc.setMetaAttributes(Collections.EMPTY_MAP); - pkc.setEmbedded(false); - pkc.setComponentClassName(revengStrategy.classNameToCompositeIdName(rc.getClassName())); + pkc.setEmbedded(false); + + String compositeIdName = revengStrategy.tableToCompositeIdName(TableIdentifier.create(rc.getTable())); + if(compositeIdName==null) { + compositeIdName = revengStrategy.classNameToCompositeIdName(rc.getClassName()); + } + pkc.setComponentClassName(compositeIdName); Table table = rc.getTable(); List list = null; if (cfg.preferBasicCompositeIds() ) { Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -171,8 +171,16 @@ return AUTO_OPTIMISTICLOCK_COLUMNS.contains(column.toLowerCase())?Boolean.TRUE:Boolean.FALSE; } - public List getSchemaSelectors() { + public List getSchemaSelections() { return null; } + + public String tableToIdentifierPropertyName(TableIdentifier tableIdentifier) { + return null; + } + + public String tableToCompositeIdName(TableIdentifier identifier) { + return null; + } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -78,7 +78,15 @@ return delegate==null?null:delegate.useColumnForOptimisticLock(identifier, column); } - public List getSchemaSelectors() { - return delegate==null?null:delegate.getSchemaSelectors(); + public List getSchemaSelections() { + return delegate==null?null:delegate.getSchemaSelections(); + } + + public String tableToIdentifierPropertyName(TableIdentifier tableIdentifier) { + return delegate==null?null:delegate.tableToIdentifierPropertyName(tableIdentifier); + } + + public String tableToCompositeIdName(TableIdentifier identifier) { + return delegate==null?null:delegate.tableToCompositeIdName(identifier); } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -63,7 +63,7 @@ Set hasIndices = new HashSet(); - List schemaSelectors = revengStrategy.getSchemaSelectors(); + List schemaSelectors = revengStrategy.getSchemaSelections(); if(schemaSelectors==null) { processTables(dbs, new SchemaSelection(catalog, schema), hasIndices, progress); } else { @@ -267,7 +267,7 @@ addToMultiMap(oneToManyCandidates, className, key); } - + // map<className, foreignkey> return oneToManyCandidates; } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -72,8 +72,8 @@ String wantedClassName = element.attributeValue("class"); - Element identifier = element.element("primary-key"); - bindIdentifiers(identifier, table, repository); + Element primaryKey = element.element("primary-key"); + bindPrimaryKey(primaryKey, table, repository); List columns = element.elements("column"); bindColumns(columns, table, repository); @@ -88,9 +88,12 @@ } - private static void bindIdentifiers(Element identifier, Table table, OverrideRepository repository) { + private static void bindPrimaryKey(Element identifier, Table table, OverrideRepository repository) { if(identifier==null) return; + String propertyName = identifier.attributeValue("property"); + String compositeIdName = identifier.attributeValue("composite-id-class"); + Element element = identifier.element("generator"); if(element!=null) { String identifierClass = element.attributeValue("class"); @@ -105,9 +108,9 @@ repository.addTableIdentifierStrategy(table, identifierClass, params); } - List boundColumnNames = bindColumns(identifier.elements("column"), table, repository); + List boundColumnNames = bindColumns(identifier.elements("key-column"), table, repository); - repository.addPrimaryKeyNamesForTable(table, boundColumnNames); + repository.addPrimaryKeyNamesForTable(table, boundColumnNames, propertyName, compositeIdName); } @@ -116,7 +119,9 @@ while( iterator.hasNext() ) { Element element = (Element) iterator.next(); - + + String constraintName = element.attributeValue("constraint-name"); + String foreignTableName = element.attributeValue("foreign-table"); if(foreignTableName!=null) { Table foreignTable = new Table(); @@ -139,12 +144,26 @@ localColumns.add(localColumn); foreignColumns.add(foreignColumn); } + + ForeignKey key = table.createForeignKey(constraintName, localColumns, foreignTableName, foreignColumns); + key.setReferencedTable(foreignTable); // only possible if foreignColumns is explicitly specified (workaround on aligncolumns) + } + + if(StringHelper.isNotEmpty(constraintName)) { + String manyToOneProperty = null; + Element manyToOne = element.element("many-to-one"); + if(manyToOne!=null) { + manyToOneProperty = manyToOne.attributeValue("property"); + } - ForeignKey key = table.createForeignKey(null, localColumns, foreignTableName, foreignColumns); - key.setReferencedTable(foreignTable); // only possible if foreignColumns is explicitly specified (workaround on aligncolumns) + String collectionProperty = null; + Element collection = element.element("set"); + if(collection!=null) { + collectionProperty = collection.attributeValue("property"); + } + repository.addForeignKeyInfo(constraintName, manyToOneProperty, collectionProperty); } - } } @@ -236,7 +255,7 @@ while (iterator.hasNext() ) { Element element = (Element) iterator.next(); SQLTypeMapping mapping = new SQLTypeMapping(JDBCToHibernateTypeHelper.getJDBCType(element.attributeValue("jdbc-type") ) ); - mapping.setHibernateType(element.attributeValue("hibernate-type") ); + mapping.setHibernateType( getHibernateType( element ) ); mapping.setLength(getInteger(element.attributeValue("length"), SQLTypeMapping.UNKNOWN_LENGTH) ); mapping.setPrecision(getInteger(element.attributeValue("precision"), SQLTypeMapping.UNKNOWN_PRECISION) ); mapping.setScale(getInteger(element.attributeValue("scale"), SQLTypeMapping.UNKNOWN_SCALE) ); @@ -247,10 +266,30 @@ boolean nullable = notNull.equals( "false" ); mapping.setNullable( Boolean.valueOf(nullable) ); } + + if(StringHelper.isEmpty(mapping.getHibernateType())) { + throw new MappingException("No hibernate-type specified for " + element.attributeValue("jdbc-type") + " at " + element.getUniquePath()); + } repository.addTypeMapping(mapping); } } + + private static String getHibernateType(Element element) { + String attributeValue = element.attributeValue("hibernate-type"); + + if(StringHelper.isEmpty(attributeValue)) { + Element child = element.element("hibernate-type"); + if(child==null) { + return null; + } else { + return child.attributeValue("name"); + } + + } + + return attributeValue; + } private static int getInteger(String string, int defaultValue) { if(string==null) { Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -55,14 +55,18 @@ final private Map tableToClassName; final private List schemaSelections; + + final private Map propertyNameForPrimaryKey; + + final private Map compositeIdNameForTable; + + final private Map foreignKeyToEntityName; + + final private Map foreignKeyToCollectionName; //private String defaultCatalog; //private String defaultSchema; - - - - public OverrideRepository() { //this.defaultCatalog = null; //this.defaultSchema = null; @@ -77,9 +81,13 @@ identifierStrategyForTable = new HashMap(); identifierPropertiesForTable = new HashMap(); primaryKeyColumnsForTable = new HashMap(); + propertyNameForPrimaryKey = new HashMap(); tableToClassName = new HashMap(); excludedColumns = new HashSet(); schemaSelections = new ArrayList(); + compositeIdNameForTable = new HashMap(); + foreignKeyToEntityName = new HashMap(); + foreignKeyToCollectionName = new HashMap(); } public OverrideRepository addFile(File xmlFile) { @@ -258,9 +266,17 @@ return excludedColumns.contains(TABLECOLUMN_KEY_FACTORY.newInstance(identifier, columnName)); } - public List getSchemaSelectors() { + public String tableToCompositeIdName(TableIdentifier identifier) { + String result = (String) compositeIdNameForTable.get(identifier); + if(result==null) { + return super.tableToCompositeIdName(identifier); + } else { + return result; + } + } + public List getSchemaSelections() { if(schemaSelections.isEmpty()) { - return super.getSchemaSelectors(); + return super.getSchemaSelections(); } else { return schemaSelections; } @@ -328,6 +344,15 @@ } } + public String tableToIdentifierPropertyName(TableIdentifier tableIdentifier) { + String result = (String) propertyNameForPrimaryKey.get(tableIdentifier); + if(result==null) { + return super.tableToIdentifierPropertyName(tableIdentifier); + } else { + return result; + } + } + public String getTableIdentifierStrategyName(TableIdentifier tableIdentifier) { String result = (String) identifierStrategyForTable.get(tableIdentifier); if(result==null) { @@ -354,6 +379,24 @@ return result; } } + + public String foreignKeyToEntityName(String keyname, TableIdentifier fromTable, List fromColumnNames, TableIdentifier referencedTable, List referencedColumnNames, boolean uniqueReference) { + String property = (String) foreignKeyToEntityName.get(keyname); + if(property==null) { + return super.foreignKeyToEntityName(keyname, fromTable, fromColumnNames, referencedTable, referencedColumnNames, uniqueReference); + } else { + return property; + } + } + + public String foreignKeyToCollectionName(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns, boolean uniqueReference) { + String property = (String) foreignKeyToCollectionName.get(keyname); + if(property==null) { + return super.foreignKeyToCollectionName(keyname, fromTable, fromColumns, referencedTable, referencedColumns, uniqueReference); + } else { + return property; + } + } }; } @@ -415,11 +458,17 @@ } } - public void addPrimaryKeyNamesForTable(Table table, List boundColumnNames) { + public void addPrimaryKeyNamesForTable(Table table, List boundColumnNames, String propertyName, String compositeIdName) { + TableIdentifier tableIdentifier = TableIdentifier.create(table); if(boundColumnNames!=null && !boundColumnNames.isEmpty()) { - primaryKeyColumnsForTable.put(TableIdentifier.create(table), boundColumnNames); + primaryKeyColumnsForTable.put(tableIdentifier, boundColumnNames); } - + if(StringHelper.isNotEmpty(propertyName)) { + propertyNameForPrimaryKey.put(tableIdentifier, propertyName); + } + if(StringHelper.isNotEmpty(compositeIdName)) { + compositeIdNameForTable.put(tableIdentifier, compositeIdName); + } } /*public String getCatalog(String string) { @@ -434,6 +483,15 @@ schemaSelections.add(schemaSelection); } + public void addForeignKeyInfo(String constraintName, String manyToOneProperty, String collectionProperty) { + if(StringHelper.isNotEmpty(manyToOneProperty)) { + foreignKeyToEntityName.put(constraintName, manyToOneProperty); + } + if(StringHelper.isNotEmpty(collectionProperty)) { + foreignKeyToCollectionName.put(constraintName, collectionProperty); + } + } + } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -68,6 +68,10 @@ public Properties getTableIdentifierProperties(TableIdentifier identifier); + /** + * If a table does not have any primarykey columns reported, this method is called. + * @return list of strings for each column name that is part of the primary key + **/ public List getPrimaryKeyColumnNames(TableIdentifier identifier); /** @@ -103,7 +107,11 @@ * * @return null */ - public List getSchemaSelectors(); + public List getSchemaSelections(); + public String tableToIdentifierPropertyName(TableIdentifier tableIdentifier); + + public String tableToCompositeIdName(TableIdentifier identifier); + } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2006-03-10 23:34:42 UTC (rev 9598) @@ -22,15 +22,18 @@ <!ELEMENT type-mapping ( sql-type+ ) > <!-- Defines a sql-type mapping. Will match on any combination of jdbc-type, length, precision and/or scale - first match will win. --> -<!ELEMENT sql-type EMPTY > +<!ELEMENT sql-type (hibernate-type?) > <!ATTLIST sql-type name CDATA #IMPLIED > <!ATTLIST sql-type jdbc-type CDATA #IMPLIED > <!ATTLIST sql-type length CDATA #IMPLIED > <!ATTLIST sql-type precision CDATA #IMPLIED > <!ATTLIST sql-type scale CDATA #IMPLIED > <!ATTLIST sql-type not-null (true|false) #IMPLIED > -<!ATTLIST sql-type hibernate-type CDATA #REQUIRED > +<!ATTLIST sql-type hibernate-type CDATA #IMPLIED > +<!ELEMENT hibernate-type EMPTY> +<!ATTLIST hibernate-type name CDATA #REQUIRED > + <!-- Used to target the selection from the database schema. Each schema-selection can be viewed as a "call" to DatabaseMetaData.getTables(). --> <!ELEMENT schema-selection EMPTY> @@ -70,14 +73,18 @@ <!ATTLIST key-column property CDATA #IMPLIED > <!ELEMENT primary-key (generator?, key-column*) > +<!-- Property name to use for this primary key --> +<!ATTLIST primary-key property CDATA #IMPLIED > +<!-- Class to use if primary-key is a composite --> +<!ATTLIST primary-key composite-id-class CDATA #IMPLIED > <!ELEMENT generator (param*)> <!ATTLIST generator class CDATA #REQUIRED> <!ELEMENT param (#PCDATA)> <!ATTLIST param name CDATA #REQUIRED> -<!ELEMENT foreign-key (column-ref+) > -<!ATTLIST foreign-key name CDATA #IMPLIED > +<!ELEMENT foreign-key (column-ref+,many-to-one?,(set|bag)?) > +<!ATTLIST foreign-key constraint-name CDATA #IMPLIED > <!ATTLIST foreign-key foreign-catalog CDATA #IMPLIED > <!ATTLIST foreign-key foreign-schema CDATA #IMPLIED > <!ATTLIST foreign-key foreign-table CDATA #REQUIRED > @@ -88,6 +95,15 @@ <!ATTLIST column-ref local-column CDATA #REQUIRED > <!ATTLIST column-ref foreign-column CDATA #IMPLIED > +<!ELEMENT many-to-one EMPTY > +<!ATTLIST many-to-one property CDATA #REQUIRED> + +<!ELEMENT set EMPTY > +<!ATTLIST set property CDATA #REQUIRED> + +<!ELEMENT bag EMPTY > +<!ATTLIST bag property CDATA #REQUIRED> + <!-- a table-filter allows to explicitly exclude or include tables or complete catalog/schemas into the reverse engineering --> <!ELEMENT table-filter EMPTY > <!ATTLIST table-filter match-catalog CDATA ".*" > Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/ConfigurationTask.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/ConfigurationTask.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/ConfigurationTask.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -98,7 +98,7 @@ Object object = resolver.newInstance(); configuration.setNamingStrategy((NamingStrategy) object); - getProject().log("Using " + entityResolver + " as naming strategy"); + getProject().log("Using " + namingStrategy + " as naming strategy"); } catch (Exception e) { throw new BuildException("Could not create or find " + namingStrategy + " class to use for naming strategy"); Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2CfgXmlExporterTask.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2CfgXmlExporterTask.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2CfgXmlExporterTask.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -29,7 +29,7 @@ protected Exporter configureExporter(Exporter exporter) { HibernateConfigurationExporter hce = (HibernateConfigurationExporter)super.configureExporter( exporter ); - hce.setEjb3(ejb3); + hce.getProperties().setProperty("ejb3", ""+ejb3); return hce; } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -32,8 +32,8 @@ protected Exporter configureExporter(Exporter exp) { POJOExporter exporter = (POJOExporter) exp; super.configureExporter( exp ); - exporter.setEjb3( ejb3 ); - exporter.setJdk5( jdk5 ); + exporter.getProperties().setProperty("ejb3", ""+ejb3); + exporter.getProperties().setProperty("jdk5", ""+jdk5); return exporter; } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/HibernateConfigurationExporter.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/HibernateConfigurationExporter.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/HibernateConfigurationExporter.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -28,7 +28,6 @@ private Writer output; private Properties customProperties = new Properties(); - private boolean ejb3; public HibernateConfigurationExporter(Configuration configuration, File outputdir) { super(configuration, outputdir); @@ -77,12 +76,14 @@ " \"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\">\r\n" + "<hibernate-configuration>"); + boolean ejb3 = Boolean.valueOf((String)getProperties().get("ejb3")).booleanValue(); + Map props = new TreeMap(); if(getConfiguration()!=null) { props.putAll(getConfiguration().getProperties() ); } if(customProperties!=null) { - props.putAll(customProperties); + props.putAll(customProperties); } String sfname = (String) props.get(Environment.SESSION_FACTORY_NAME); @@ -155,8 +156,4 @@ public String getName() { return "cfg2cfgxml"; } - - public void setEjb3(boolean b) { - this.ejb3 = b; - } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/POJOExporter.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/POJOExporter.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/POJOExporter.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -6,8 +6,6 @@ import java.io.File; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.hibernate.cfg.Configuration; /** @@ -16,9 +14,6 @@ public class POJOExporter extends GenericExporter { private static final String POJO_JAVACLASS_VM = "Pojo"; - - private boolean ejb3; - private boolean jdk5; public POJOExporter(Configuration cfg, File outputdir) { super(cfg, outputdir); @@ -34,31 +29,19 @@ public POJOExporter() { init(); } - - protected void setupContext() { - getProperties().put("ejb3", "" + useEjb3()); - getProperties().put("jdk5", "" + useJdk5()); - super.setupContext(); - } - - public boolean useEjb3() { - return ejb3; - } - - public void setEjb3(boolean ejb3) { - this.ejb3 = ejb3; - } - - public boolean useJdk5() { - return jdk5; - } - - public void setJdk5(boolean jdk5) { - this.jdk5 = jdk5; - } - + public String getName() { return "hbm2java"; } - + + protected void setupContext() { + //TODO: this safe guard should be in the root templates instead for each variable they depend on. + if(!getProperties().containsKey("ejb3")) { + getProperties().put("ejb3", "false"); + } + if(!getProperties().containsKey("jdk5")) { + getProperties().put("jdk5", "false"); + } + super.setupContext(); + } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/seam/SeamExporter.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/seam/SeamExporter.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/seam/SeamExporter.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -70,8 +70,8 @@ exporter.setProperties((Properties) getProperties().clone()); exporter.setTemplatePath(getTemplatePaths()); exporter.setArtifactCollector(getArtifactCollector()); - exporter.setEjb3(true); - exporter.setJdk5(true); + exporter.getProperties().setProperty("ejb3", "true"); + exporter.getProperties().setProperty("jdk5", "true"); exporter.setFilePattern("src/{package-name}/{class-name}.java"); exporter.start(); Modified: trunk/HibernateExt/tools/src/templates/dao/daohome.ftl =================================================================== --- trunk/HibernateExt/tools/src/templates/dao/daohome.ftl 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/templates/dao/daohome.ftl 2006-03-10 23:34:42 UTC (rev 9598) @@ -168,8 +168,8 @@ .createCriteria("${clazz.entityName}") <#if jdk5> .add( ${pojo.staticImport("org.hibernate.criterion.Restrictions", "naturalId")}() -<#else> - .add( ${pojo.importType("org.hibernate.criterion.Restrictions", "naturalId")}() +<#else> + .add( ${pojo.importType("org.hibernate.criterion.Restrictions")}.naturalId() </#if> <#foreach property in pojo.getAllPropertiesIterator()> <#if property.isNaturalIdentifier()> Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/ant/SeamAntTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/ant/SeamAntTest.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/ant/SeamAntTest.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -5,6 +5,7 @@ package org.hibernate.tool.ant; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -15,6 +16,9 @@ import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; import org.hibernate.tool.test.TestHelper; +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; /** * A temporary test class for controlling the seam template generation Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -62,7 +62,7 @@ exporter.start(); exporter = new POJOExporter(cfg,getOutputDir()); - exporter.setEjb3(true); + exporter.getProperties().setProperty("ejb3", "true"); exporter.start(); TestHelper.deleteDir(getOutputDir()); @@ -121,7 +121,7 @@ HibernateConfigurationExporter exporter = new HibernateConfigurationExporter(cfg,getOutputDir()); - exporter.setEjb3(true); + exporter.getProperties().setProperty("ejb3", "true"); exporter.start(); Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2DaoTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2DaoTest.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2DaoTest.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -26,8 +26,8 @@ POJOExporter javaExporter = new POJOExporter(getCfg(), getOutputDir() ); POJOExporter exporter = new DAOExporter(getCfg(), getOutputDir() ); - exporter.setEjb3(false); - exporter.setJdk5(true); + exporter.getProperties().setProperty("ejb3", "false"); + exporter.getProperties().setProperty("jdk5", "true"); exporter.start(); javaExporter.start(); } Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2EJBDaoTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2EJBDaoTest.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2EJBDaoTest.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -26,8 +26,8 @@ POJOExporter javaExporter = new POJOExporter(getCfg(), getOutputDir() ); POJOExporter exporter = new DAOExporter(getCfg(), getOutputDir() ); - exporter.setEjb3(true); - exporter.setJdk5(true); + exporter.getProperties().setProperty("ejb3", "true"); + exporter.getProperties().setProperty("jdk5", "true"); exporter.start(); javaExporter.start(); } Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2HibernateDAOTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2HibernateDAOTest.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2HibernateDAOTest.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -26,8 +26,8 @@ POJOExporter javaExporter = new POJOExporter(getCfg(), getOutputDir() ); POJOExporter exporter = new DAOExporter(getCfg(), getOutputDir() ); - exporter.setEjb3(false); - exporter.setJdk5(true); + exporter.getProperties().setProperty("ejb3", "false"); + exporter.getProperties().setProperty("jdk5", "true"); exporter.start(); javaExporter.start(); } Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2JavaEjb3Test.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2JavaEjb3Test.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2JavaEjb3Test.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -29,8 +29,8 @@ POJOExporter exporter = new POJOExporter(getCfg(), getOutputDir() ); exporter.setTemplatePath(new String[0]); - exporter.setEjb3(true); - exporter.setJdk5(true); + exporter.getProperties().setProperty("ejb3", "true"); + exporter.getProperties().setProperty("jdk5", "true"); exporter.start(); } Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2JavaTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2JavaTest.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/Hbm2JavaTest.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -415,7 +415,7 @@ POJOExporter exporter = new POJOExporter( getCfg(), file ); artifactCollector = new ArtifactCollector(); exporter.setArtifactCollector(artifactCollector); - exporter.setJdk5(true); + exporter.getProperties().setProperty("jdk5", "true"); exporter.start(); File cfile = new File( getOutputDir(), "genericscompilable" ); Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -24,6 +24,7 @@ import org.hibernate.cfg.reveng.TableFilter; import org.hibernate.cfg.reveng.TableIdentifier; import org.hibernate.mapping.Column; +import org.hibernate.mapping.Component; import org.hibernate.mapping.ForeignKey; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Property; @@ -90,7 +91,7 @@ or.addResource(SCHEMA_REVENG_XML); ReverseEngineeringStrategy repository = or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy()); - List schemaSelectors = repository.getSchemaSelectors(); + List schemaSelectors = repository.getSchemaSelections(); assertNotNull(schemaSelectors); assertEquals(4,schemaSelectors.size()); @@ -169,22 +170,43 @@ assertNull(repository.getTableIdentifierStrategyName(new TableIdentifier("blah"))); assertNull(repository.getTableIdentifierProperties(new TableIdentifier("blah"))); - assertEquals("sequence",repository.getTableIdentifierStrategyName(new TableIdentifier(null, null, "ORDERS"))); - Map props = repository.getTableIdentifierProperties(new TableIdentifier(null, null, "ORDERS")); + TableIdentifier ordersTable = new TableIdentifier(null,null, "ORDERS"); + assertEquals("sequence",repository.getTableIdentifierStrategyName(ordersTable)); + Map props = repository.getTableIdentifierProperties(ordersTable); assertEquals("seq_table", props.get("table")); + assertEquals("customOrderId", repository.tableToIdentifierPropertyName(ordersTable)); + assertEquals(null, repository.tableToIdentifierPropertyName(new TableIdentifier("blah"))); + + assertEquals("CustomOID", repository.tableToCompositeIdName(ordersTable)); + assertEquals(null, repository.tableToCompositeIdName(new TableIdentifier("blah"))); + + List primaryKeyColumnNames = repository.getPrimaryKeyColumnNames(new TableIdentifier("blah")); + assertNull(primaryKeyColumnNames); + + primaryKeyColumnNames = repository.getPrimaryKeyColumnNames(ordersTable); + assertNotNull(primaryKeyColumnNames); + assertEquals(2, primaryKeyColumnNames.size()); + assertEquals("ORDERID", primaryKeyColumnNames.get(0)); + assertEquals("CUSTID", primaryKeyColumnNames.get(1)); + assertFalse(repository.excludeColumn(ordersTable, "CUSTID")); + // applied PersistentClass classMapping = cfg.getClassMapping("Orders"); - SimpleValue sv = (SimpleValue) classMapping.getIdentifier(); + Component sv = (Component) classMapping.getIdentifier(); + assertEquals("CustomOID", sv.getComponentClassName()); assertEquals("sequence", sv.getIdentifierGeneratorStrategy()); // will fail if default schema is not set since then there is no match in the override binder assertNotNull(sv.getIdentifierGeneratorProperties()); assertEquals("seq_table", sv.getIdentifierGeneratorProperties().getProperty("table")); - assertEquals(1,classMapping.getIdentifierProperty().getColumnSpan()); + assertEquals(2,classMapping.getIdentifierProperty().getColumnSpan()); + Property identifierProperty = classMapping.getIdentifierProperty(); + assertEquals("customOrderId", identifierProperty.getName()); } + public void testReadExcludeTables() { OverrideRepository or = buildOverrideRepository(); @@ -347,13 +369,14 @@ ForeignKey fk = (ForeignKey) foreignKeyIterator.next(); assertEquals(fk.getReferencedTable().getName(), identifier("Parent") ); assertEquals(2, fk.getReferencedColumns().size()); + assertEquals("child_to_parent", fk.getName()); PersistentClass classMapping = cfg.getClassMapping("Children"); - Property property = classMapping.getProperty("parent"); + Property property = classMapping.getProperty("propertyParent"); assertEquals(2,property.getColumnSpan()); classMapping = cfg.getClassMapping("Parent"); - property = classMapping.getProperty("childrens"); + property = classMapping.getProperty("propertyChildren"); } @@ -405,7 +428,7 @@ "create table misc_types ( id numeric(10,0) not null, name varchar(20), shortname varchar(5), flag varchar(1), primary key (id) )", "create table inthemiddle ( miscid numeric(10,0), defunctid numeric(10,0), foreign key (miscid) references misc_types, foreign key (defunctid) references defunct_table )", "create table customer ( custid varchar(10), name varchar(20) )", - "create table orders ( orderid varchar(10), name varchar(20), custid varchar(10), completed numeric(1) not null, verified numeric(1), primary key (orderid) )", + "create table orders ( orderid varchar(10), name varchar(20), custid varchar(10), completed numeric(1) not null, verified numeric(1) )", "create table parent ( id varchar(10), name varchar(20))", "create table children ( id varchar(10), parentid varchar(10), name varchar(20) )", "create table excolumns (id varchar(12), name varchar(20), excolumn numeric(10,0) )" Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/overridetest.reveng.xml =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/overridetest.reveng.xml 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/overridetest.reveng.xml 2006-03-10 23:34:42 UTC (rev 9598) @@ -6,8 +6,9 @@ <type-mapping> <sql-type jdbc-type="VARCHAR" length='20' hibernate-type="SomeUserType" /> - <sql-type jdbc-type="VARCHAR" length='1' - hibernate-type="yes_no" /> + <sql-type jdbc-type="VARCHAR" length='1'> + <hibernate-type name="yes_no"/> + </sql-type> <sql-type jdbc-type="NUMERIC" precision='10' scale='2' hibernate-type="string" /> </type-mapping> @@ -44,11 +45,12 @@ alter table Customer add constraint 'max' foreign key (addressid, x) references address (dfdf) --> <table name="ORDERS"> - <primary-key> + <primary-key property="customOrderId" composite-id-class="CustomOID"> <generator class="sequence"> <param name="table">seq_table</param> </generator> <!-- <column name="CUSTID" foreign-table="CUSTOMER" foreign-column="CUSTID" /> --> + <key-column name="ORDERID"/> <key-column name="CUSTID"/> </primary-key> <column name="NAME" property="orderName" type="string" /> @@ -59,14 +61,16 @@ </table> - <table name="CHILDREN"> - <foreign-key foreign-table="PARENT"> + <table name="CHILDREN"> + <foreign-key constraint-name="child_to_parent" foreign-table="PARENT"> <column-ref local-column="parentid" foreign-column="id" /> - <column-ref local-column="extraparentid" - foreign-column="extraid" /> + <column-ref local-column="extraparentid" foreign-column="extraid" /> + <many-to-one property="propertyParent"/> + <set property="propertyChildren"/> </foreign-key> - </table> + </table> + <table name="EXCOLUMNS"> <column name="EXCOLUMN" exclude="true"/> </table> Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/schemaselection.reveng.xml =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/schemaselection.reveng.xml 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/schemaselection.reveng.xml 2006-03-10 23:34:42 UTC (rev 9598) @@ -14,7 +14,5 @@ <!-- .* is valid, will be translated into % --> <schema-selection match-catalog="PUBLIC.*" match-schema="OVRTEST" match-table=".*"/> - - </hibernate-reverse-engineering> \ No newline at end of file Modified: trunk/HibernateExt/tools/src/test5.0/org/hibernate/tool/hbm2x/Hbm2JavaEjb3ForJDK50Test.java =================================================================== --- trunk/HibernateExt/tools/src/test5.0/org/hibernate/tool/hbm2x/Hbm2JavaEjb3ForJDK50Test.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/test5.0/org/hibernate/tool/hbm2x/Hbm2JavaEjb3ForJDK50Test.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -31,8 +31,8 @@ POJOExporter exporter = new POJOExporter( getCfg(), getOutputDir() ); exporter.setTemplatePath( new String[0] ); - exporter.setEjb3( true ); - exporter.setJdk5( true ); + exporter.getProperties().setProperty("ejb3", "true"); + exporter.getProperties().setProperty("jdk5", "true"); exporter.start(); } Modified: trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2006-03-10 23:20:53 UTC (rev 9597) +++ trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2006-03-10 23:34:42 UTC (rev 9598) @@ -100,8 +100,18 @@ return false; } - public List getSchemaSelectors() { + public List getSchemaSelections() { // TODO Auto-generated method stub return null; } + + public String tableToIdentifierPropertyName(TableIdentifier tableIdentifier) { + // TODO Auto-generated method stub + return null; + } + + public String tableToCompositeIdName(TableIdentifier identifier) { + // TODO Auto-generated method stub + return null; + } } |
From: <hib...@li...> - 2006-03-10 23:20:57
|
Author: max...@jb... Date: 2006-03-10 18:20:53 -0500 (Fri, 10 Mar 2006) New Revision: 9597 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/tool/hbm2ddl/DatabaseMetadata.java Log: HHH-1325 AIOOB in schemaupdate Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/tool/hbm2ddl/DatabaseMetadata.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/tool/hbm2ddl/DatabaseMetadata.java 2006-03-10 23:19:23 UTC (rev 9596) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/tool/hbm2ddl/DatabaseMetadata.java 2006-03-10 23:20:53 UTC (rev 9597) @@ -142,9 +142,9 @@ } else { String[] strings = StringHelper.split(".", (String) key); if(strings.length==3) { - return getTableMetadata(strings[2], strings[1], strings[2]) != null; + return getTableMetadata(strings[2], strings[1], strings[0]) != null; } else if (strings.length==2) { - return getTableMetadata(strings[2], strings[1], null) != null; + return getTableMetadata(strings[1], strings[0], null) != null; } } } |
From: <hib...@li...> - 2006-03-10 23:19:26
|
Author: max...@jb... Date: 2006-03-10 18:19:23 -0500 (Fri, 10 Mar 2006) New Revision: 9596 Modified: trunk/Hibernate3/src/org/hibernate/tool/hbm2ddl/DatabaseMetadata.java Log: HHH-1325 AIOOB in schemaupdate Modified: trunk/Hibernate3/src/org/hibernate/tool/hbm2ddl/DatabaseMetadata.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/tool/hbm2ddl/DatabaseMetadata.java 2006-03-10 18:14:21 UTC (rev 9595) +++ trunk/Hibernate3/src/org/hibernate/tool/hbm2ddl/DatabaseMetadata.java 2006-03-10 23:19:23 UTC (rev 9596) @@ -142,9 +142,9 @@ } else { String[] strings = StringHelper.split(".", (String) key); if(strings.length==3) { - return getTableMetadata(strings[2], strings[1], strings[2]) != null; + return getTableMetadata(strings[2], strings[1], strings[0]) != null; } else if (strings.length==2) { - return getTableMetadata(strings[2], strings[1], null) != null; + return getTableMetadata(strings[1], strings[0], null) != null; } } } |
From: <hib...@li...> - 2006-03-10 18:14:29
|
Author: ste...@jb... Date: 2006-03-10 13:14:21 -0500 (Fri, 10 Mar 2006) New Revision: 9595 Added: trunk/Hibernate3/test/org/hibernate/test/connections/Other.java Modified: trunk/Hibernate3/src/org/hibernate/Transaction.java trunk/Hibernate3/src/org/hibernate/engine/SessionImplementor.java trunk/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java trunk/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java trunk/Hibernate3/src/org/hibernate/jdbc/JDBCContext.java trunk/Hibernate3/src/org/hibernate/transaction/CMTTransaction.java trunk/Hibernate3/src/org/hibernate/transaction/CMTTransactionFactory.java trunk/Hibernate3/src/org/hibernate/transaction/JDBCTransaction.java trunk/Hibernate3/src/org/hibernate/transaction/JDBCTransactionFactory.java trunk/Hibernate3/src/org/hibernate/transaction/JTATransaction.java trunk/Hibernate3/src/org/hibernate/transaction/JTATransactionFactory.java trunk/Hibernate3/src/org/hibernate/transaction/TransactionFactory.java trunk/Hibernate3/src/org/hibernate/util/JTAHelper.java trunk/Hibernate3/test/org/hibernate/test/connections/AggressiveReleaseTest.java trunk/Hibernate3/test/org/hibernate/test/connections/BasicConnectionProviderTest.java trunk/Hibernate3/test/org/hibernate/test/connections/ConnectionManagementTestCase.java trunk/Hibernate3/test/org/hibernate/test/connections/CurrentSessionConnectionTest.java trunk/Hibernate3/test/org/hibernate/test/connections/Silly.hbm.xml trunk/Hibernate3/test/org/hibernate/test/connections/Silly.java trunk/Hibernate3/test/org/hibernate/test/connections/SuppliedConnectionTest.java trunk/Hibernate3/test/org/hibernate/test/connections/ThreadLocalCurrentSessionTest.java trunk/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java trunk/Hibernate3/test/org/hibernate/test/tm/CMTTest.java Log: HHH-1555 : maintain connections during flush even with aggressive release; HHH-1559 : facilitate EJB3 joinTransaction; test suite cleanup Modified: trunk/Hibernate3/src/org/hibernate/Transaction.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/Transaction.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/Transaction.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -31,9 +31,11 @@ public void begin() throws HibernateException; /** - * Flush the associated <tt>Session</tt> and end the unit of work. + * Flush the associated <tt>Session</tt> and end the unit of work (unless + * we are in {@link FlushMode#NEVER}. + * </p> * This method will commit the underlying transaction if and only - * if the transaction was initiated by this object. + * if the underlying transaction was initiated by this object. * * @throws HibernateException */ @@ -48,37 +50,56 @@ /** * Was this transaction rolled back or set to rollback only? + * <p/> + * This only accounts for actions initiated from this local transaction. + * If, for example, the underlying transaction is forced to rollback via + * some other means, this method still reports false because the rollback + * was not initiated from here. * - * @return boolean + * @return boolean True if the transaction was rolled back via this + * local transaction; false otherwise. * @throws HibernateException */ public boolean wasRolledBack() throws HibernateException; /** - * Check if this transaction was successfully committed. This method - * could return <tt>false</tt> even after successful invocation - * of <tt>commit()</tt>. + * Check if this transaction was successfully committed. + * <p/> + * This method could return <tt>false</tt> even after successful invocation + * of {@link #commit}. As an example, JTA based strategies no-op on + * {@link #commit} calls if they did not start the transaction; in that case, + * they also report {@link #wasCommitted} as false. * - * @return boolean + * @return boolean True if the transaction was (unequivocally) committed + * via this local transaction; false otherwise. * @throws HibernateException */ public boolean wasCommitted() throws HibernateException; /** * Is this transaction still active? - * @return boolean + * <p/> + * Again, this only returns information in relation to the + * local transaction, not the actual underlying transaction. + * + * @return boolean Treu if this local transaction is still active. */ public boolean isActive() throws HibernateException; - + /** - * Register a user synchronization callback for this transaction + * Register a user synchronization callback for this transaction. + * + * @param synchronization The Synchronization callback to register. + * @throws HibernateException */ public void registerSynchronization(Synchronization synchronization) throws HibernateException; - + /** * Set the transaction timeout for any transaction started by * a subsequent call to <tt>begin()</tt> on this instance. + * + * @param seconds The number of seconds before a timeout. */ public void setTimeout(int seconds); } Modified: trunk/Hibernate3/src/org/hibernate/engine/SessionImplementor.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/SessionImplementor.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/engine/SessionImplementor.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -284,4 +284,14 @@ public String getFetchProfile(); public JDBCContext getJDBCContext(); + + /** + * Determine whether the session is closed. Provided seperately from + * {@link #isOpen()} as this method does not attempt any JTA synch + * registration, where as {@link #isOpen()} does; which makes this one + * nicer to use for most internal purposes. + * + * @return True if the session is closed; false otherwise. + */ + public boolean isClosed(); } Modified: trunk/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -289,6 +289,7 @@ log.trace("executing flush"); try { + session.getJDBCContext().getConnectionManager().flushBeginning(); // we need to lock the collection caches before // executing entity inserts/updates in order to // account for bidi associations @@ -299,6 +300,9 @@ log.error("Could not synchronize database state with session", he); throw he; } + finally { + session.getJDBCContext().getConnectionManager().flushEnding(); + } } Modified: trunk/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -46,6 +46,7 @@ private transient Batcher batcher; private transient Interceptor interceptor; private boolean isClosed; + private transient boolean isFlushing; /** * Constructs a ConnectionManager. @@ -261,7 +262,10 @@ */ public void afterStatement() { if ( isAggressiveRelease() ) { - if ( batcher.hasOpenResources() ) { + if ( isFlushing ) { + log.debug( "skipping aggressive-release due to flush cycle" ); + } + else if ( batcher.hasOpenResources() ) { log.debug( "skipping aggresive-release due to open resources on batcher" ); } else if ( borrowedConnection != null ) { @@ -450,6 +454,26 @@ } } + /** + * Callback to let us know that a flush is beginning. We use this fact + * to temporarily circumvent aggressive connection releasing until after + * the flush cycle is complete {@link #flushEnding()} + */ + public void flushBeginning() { + log.trace( "registering flush begin" ); + isFlushing = true; + } + + /** + * Callback to let us know that a flush is ending. We use this fact to + * stop circumventing aggressive releasing connections. + */ + public void flushEnding() { + log.trace( "registering flush end" ); + isFlushing = false; + afterStatement(); + } + public boolean isReadyForSerialization() { return wasConnectionSupplied ? connection == null : !batcher.hasOpenResources(); } Modified: trunk/Hibernate3/src/org/hibernate/jdbc/JDBCContext.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/jdbc/JDBCContext.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/jdbc/JDBCContext.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -22,7 +22,6 @@ import org.hibernate.exception.JDBCExceptionHelper; import org.hibernate.transaction.CacheSynchronization; import org.hibernate.transaction.TransactionFactory; -import org.hibernate.util.JTAHelper; /** * Acts as the mediary between "entity-mode related" sessions in terms of @@ -87,15 +86,6 @@ // ConnectionManager.Callback implementation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public void connectionOpened() { - if ( !isTransactionCallbackRegistered ) { - // If there is no current transaction callback registered - // when we obtain a connection, try to register one now. - // Note that this is not going to handle the case of - // multiple-transactions-per-connection when the user is - // manipulating transactions (need to use Hibernate txn) - registerSynchronizationIfPossible(); - } - if ( owner.getFactory().getStatistics().isStatisticsEnabled() ) { owner.getFactory().getStatisticsImplementor().connect(); } @@ -140,25 +130,46 @@ } public boolean registerSynchronizationIfPossible() { - if ( isTransactionCallbackRegistered ) return true; + if ( isTransactionCallbackRegistered ) { + // we already have a callback registered; either a local + // (org.hibernate.Transaction) transaction has accepted + // callback responsibilities, or we have previously + // registered a transaction synch. + return true; + } + boolean localCallbacksOnly = owner.getFactory().getSettings() + .getTransactionFactory() + .areCallbacksLocalToHibernateTransactions(); + if ( localCallbacksOnly ) { + // the configured transaction-factory says it only supports + // local callback mode, so no sense attempting to register a + // JTA Synchronization + return false; + } TransactionManager tm = owner.getFactory().getTransactionManager(); if ( tm == null ) { + // if there is no TM configured, we will not be able to access + // the javax.transaction.Transaction object in order to + // register a synch anyway. return false; } else { try { - javax.transaction.Transaction tx = tm.getTransaction(); - if ( JTAHelper.isTransactionInProgress(tx) ) { + if ( !isTransactionInProgress() ) { + log.debug( "TransactionFactory reported no active transaction; Synchronization not registered" ); + return false; + } + else { + javax.transaction.Transaction tx = tm.getTransaction(); tx.registerSynchronization( new CacheSynchronization(owner, this, tx, null) ); isTransactionCallbackRegistered = true; log.debug("successfully registered Synchronization"); return true; } - else { - log.debug("no active transaction, could not register Synchronization"); - return false; - } } + catch( HibernateException e ) { + throw e; + } catch (Exception e) { throw new TransactionException( "could not register synchronization with JTA TransactionManager", e ); } @@ -166,9 +177,8 @@ } public boolean isTransactionInProgress() { - boolean isHibernateTransactionActive = hibernateTransaction!=null && - hibernateTransaction.isActive(); - return isHibernateTransactionActive || JTAHelper.isTransactionInProgress( owner.getFactory() ); + return owner.getFactory().getSettings().getTransactionFactory() + .isTransactionInProgress( this, owner, hibernateTransaction ); } public Transaction getTransaction() throws HibernateException { @@ -268,10 +278,6 @@ * @throws IOException */ public void serialize(ObjectOutputStream oos) throws IOException { - boolean deserHasCallbackRegistered = isTransactionCallbackRegistered - && ! owner.getFactory().getSettings().getTransactionFactory() - .areCallbacksLocalToHibernateTransactions(); - oos.writeBoolean( deserHasCallbackRegistered ); connectionManager.serialize( oos ); } @@ -288,7 +294,6 @@ Interceptor interceptor) throws IOException { JDBCContext jdbcContext = new JDBCContext(); jdbcContext.owner = context; - jdbcContext.isTransactionCallbackRegistered = ois.readBoolean(); jdbcContext.connectionManager = ConnectionManager.deserialize( ois, context.getFactory(), Modified: trunk/Hibernate3/src/org/hibernate/transaction/CMTTransaction.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/transaction/CMTTransaction.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/transaction/CMTTransaction.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -63,7 +63,7 @@ if (flush) { transactionContext.managedFlush(); //if an exception occurs during flush, user must call rollback() } - + begun = false; } @@ -72,7 +72,7 @@ if (!begun) { throw new TransactionException("Transaction not successfully started"); } - + log.debug("rollback"); try { @@ -82,7 +82,7 @@ log.error("Could not set transaction to rollback only", se); throw new TransactionException("Could not set transaction to rollback only", se); } - + begun = false; } Modified: trunk/Hibernate3/src/org/hibernate/transaction/CMTTransactionFactory.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/transaction/CMTTransactionFactory.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/transaction/CMTTransactionFactory.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -6,8 +6,12 @@ import org.hibernate.ConnectionReleaseMode; import org.hibernate.HibernateException; import org.hibernate.Transaction; +import org.hibernate.TransactionException; +import org.hibernate.util.JTAHelper; import org.hibernate.jdbc.JDBCContext; +import javax.transaction.SystemException; + /** * Factory for <tt>CMTTransaction</tt>. * @@ -22,7 +26,7 @@ public void configure(Properties props) throws HibernateException {} - public Transaction createTransaction(JDBCContext jdbcContext, Context transactionContext) + public Transaction createTransaction(JDBCContext jdbcContext, Context transactionContext) throws HibernateException { return new CMTTransaction(jdbcContext, transactionContext); } @@ -35,4 +39,19 @@ return false; } + public boolean isTransactionInProgress( + JDBCContext jdbcContext, + Context transactionContext, + Transaction transaction) { + try { + return JTAHelper.isTransactionInProgress( + transactionContext.getFactory().getTransactionManager().getTransaction() + ); + } + catch( SystemException se ) { + throw new TransactionException( "Unable to check transaction status", se ); + } + + } + } Modified: trunk/Hibernate3/src/org/hibernate/transaction/JDBCTransaction.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/transaction/JDBCTransaction.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/transaction/JDBCTransaction.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -50,9 +50,9 @@ if (commitFailed) { throw new TransactionException("cannot re-start transaction after failed commit"); } - - log.debug("begin"); + log.debug("begin"); + try { toggleAutoCommit = jdbcContext.connection().getAutoCommit(); if ( log.isDebugEnabled() ) { @@ -73,16 +73,16 @@ begun = true; committed = false; rolledBack = false; - + if ( timeout>0 ) { jdbcContext.getConnectionManager() .getBatcher() .setTransactionTimeout(timeout); } - + jdbcContext.afterTransactionBegin(this); } - + private void closeIfRequired() throws HibernateException { if ( callback && transactionContext.shouldAutoClose() && !transactionContext.isClosed() ) { try { @@ -106,7 +106,7 @@ transactionContext.managedFlush(); //if an exception occurs during flush, user must call rollback() } - beforeTransactionCompletion(); + notifyLocalSynchsBeforeTransactionCompletion(); if ( callback ) { jdbcContext.beforeTransactionCompletion( this ); } @@ -118,7 +118,7 @@ if ( callback ) { jdbcContext.afterTransactionCompletion( true, this ); } - afterTransactionCompletion( Status.STATUS_COMMITTED ); + notifyLocalSynchsAfterTransactionCompletion( Status.STATUS_COMMITTED ); } catch (SQLException e) { log.error("JDBC commit failed", e); @@ -126,7 +126,7 @@ if ( callback ) { jdbcContext.afterTransactionCompletion( false, this ); } - afterTransactionCompletion( Status.STATUS_UNKNOWN ); + notifyLocalSynchsAfterTransactionCompletion( Status.STATUS_UNKNOWN ); throw new TransactionException("JDBC commit failed", e); } finally { @@ -153,20 +153,20 @@ if (!commitFailed) { - /*beforeTransactionCompletion(); + /*notifyLocalSynchsBeforeTransactionCompletion(); if ( callback ) { - jdbcContext.beforeTransactionCompletion( this ); + jdbcContext.notifyLocalSynchsBeforeTransactionCompletion( this ); }*/ try { rollbackAndResetAutoCommit(); log.debug("rolled back JDBC Connection"); rolledBack = true; - afterTransactionCompletion(Status.STATUS_ROLLEDBACK); + notifyLocalSynchsAfterTransactionCompletion(Status.STATUS_ROLLEDBACK); } catch (SQLException e) { log.error("JDBC rollback failed", e); - afterTransactionCompletion(Status.STATUS_UNKNOWN); + notifyLocalSynchsAfterTransactionCompletion(Status.STATUS_UNKNOWN); throw new TransactionException("JDBC rollback failed", e); } finally { @@ -203,15 +203,15 @@ public boolean wasRolledBack() { return rolledBack; } - + public boolean wasCommitted() { return committed; } public boolean isActive() { return begun && ! ( rolledBack || committed | commitFailed ); - } - + } + public void registerSynchronization(Synchronization sync) throws HibernateException { if (sync==null) throw new NullPointerException("null Synchronization"); if (synchronizations==null) { @@ -219,8 +219,8 @@ } synchronizations.add(sync); } - - private void beforeTransactionCompletion() { + + private void notifyLocalSynchsBeforeTransactionCompletion() { if (synchronizations!=null) { for ( int i=0; i<synchronizations.size(); i++ ) { Synchronization sync = (Synchronization) synchronizations.get(i); @@ -234,7 +234,7 @@ } } - private void afterTransactionCompletion(int status) { + private void notifyLocalSynchsAfterTransactionCompletion(int status) { begun = false; if (synchronizations!=null) { for ( int i=0; i<synchronizations.size(); i++ ) { Modified: trunk/Hibernate3/src/org/hibernate/transaction/JDBCTransactionFactory.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/transaction/JDBCTransactionFactory.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/transaction/JDBCTransactionFactory.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -2,6 +2,7 @@ package org.hibernate.transaction; import java.util.Properties; +import java.sql.SQLException; import org.hibernate.ConnectionReleaseMode; import org.hibernate.Transaction; @@ -19,7 +20,7 @@ return ConnectionReleaseMode.AFTER_TRANSACTION; } - public Transaction createTransaction(JDBCContext jdbcContext, Context transactionContext) + public Transaction createTransaction(JDBCContext jdbcContext, Context transactionContext) throws HibernateException { return new JDBCTransaction( jdbcContext, transactionContext ); } @@ -34,4 +35,22 @@ return true; } + public boolean isTransactionInProgress( + JDBCContext jdbcContext, + Context transactionContext, + Transaction transaction) { +// try { +// // for JDBC-based transactions, we only want to return true +// // here if we (this transaction) are managing the transaction +// return transaction != null && +// transaction.isActive() && +// !jdbcContext.getConnectionManager().isAutoCommit(); +// } +// catch ( SQLException e ) { +// // assume we are in auto-commit! +// return false; +// } + return transaction != null && transaction.isActive(); + } + } Modified: trunk/Hibernate3/src/org/hibernate/transaction/JTATransaction.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/transaction/JTATransaction.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/transaction/JTATransaction.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -332,4 +332,8 @@ throw new TransactionException("could not set transaction timeout", se); } } + + /*package*/ UserTransaction getUserTransaction() { + return ut; + } } Modified: trunk/Hibernate3/src/org/hibernate/transaction/JTATransactionFactory.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/transaction/JTATransactionFactory.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/transaction/JTATransactionFactory.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -5,15 +5,19 @@ import javax.naming.InitialContext; import javax.naming.NamingException; +import javax.transaction.SystemException; +import javax.transaction.UserTransaction; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.ConnectionReleaseMode; import org.hibernate.HibernateException; import org.hibernate.Transaction; +import org.hibernate.TransactionException; import org.hibernate.jdbc.JDBCContext; import org.hibernate.cfg.Environment; import org.hibernate.util.NamingHelper; +import org.hibernate.util.JTAHelper; /** * Factory for <tt>JTATransaction</tt>. @@ -39,7 +43,7 @@ } utName = props.getProperty(Environment.USER_TRANSACTION); - + if (utName==null) { TransactionManagerLookup lookup = TransactionManagerLookupFactory.getTransactionManagerLookup(props); if (lookup!=null) utName = lookup.getUserTransactionName(); @@ -48,7 +52,7 @@ if (utName==null) utName = DEFAULT_USER_TRANSACTION_NAME; } - public Transaction createTransaction(JDBCContext jdbcContext, Context transactionContext) + public Transaction createTransaction(JDBCContext jdbcContext, Context transactionContext) throws HibernateException { return new JTATransaction(context, utName, jdbcContext, transactionContext); } @@ -65,4 +69,28 @@ return false; } + public boolean isTransactionInProgress( + JDBCContext jdbcContext, + Context transactionContext, + Transaction transaction) { + try { + UserTransaction ut; + if ( transaction != null ) { + ut = ( ( JTATransaction ) transaction ).getUserTransaction(); + } + else { + try { + ut = ( UserTransaction ) context.lookup( utName ); + } + catch ( NamingException e ) { + throw new TransactionException( "Unable to locate UserTrasnaction to check status" ); + } + } + return ut != null && JTAHelper.isInProgress( ut.getStatus() ); + } + catch( SystemException se ) { + throw new TransactionException( "Unable to check transaction status", se ); + } + } + } Modified: trunk/Hibernate3/src/org/hibernate/transaction/TransactionFactory.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/transaction/TransactionFactory.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/transaction/TransactionFactory.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -61,5 +61,27 @@ */ public boolean isTransactionManagerRequired(); + /** + * Are all transaction callbacks local to Hibernate Transactions? + * Or can the callbacks originate from some other source (e.g. + * a JTA Synchronization). + * + * @return true if callbacks only ever originate from + * the Hibernate {@link Transaction}; false otherwise. + */ public boolean areCallbacksLocalToHibernateTransactions(); + + /** + * Determine whether an underlying transaction is in progress. + * <p/> + * Mainly this is used in determining whether to register a + * synchronization as well as whether or not to circumvent + * auto flushing outside transactions. + * + * @param jdbcContext + * @param transactionContext + * @param transaction + * @return true if an underlying transaction is know to be in effect. + */ + public boolean isTransactionInProgress(JDBCContext jdbcContext, Context transactionContext, Transaction transaction); } Modified: trunk/Hibernate3/src/org/hibernate/util/JTAHelper.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/util/JTAHelper.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/src/org/hibernate/util/JTAHelper.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -17,13 +17,13 @@ public static boolean isRollback(int status) { return status==Status.STATUS_MARKED_ROLLBACK || - status==Status.STATUS_ROLLING_BACK || - status==Status.STATUS_ROLLEDBACK; + status==Status.STATUS_ROLLING_BACK || + status==Status.STATUS_ROLLEDBACK; } public static boolean isInProgress(int status) { return status==Status.STATUS_ACTIVE || - status==Status.STATUS_MARKED_ROLLBACK; + status==Status.STATUS_MARKED_ROLLBACK; } /** @@ -33,7 +33,7 @@ public static boolean isTransactionInProgress(SessionFactoryImplementor factory) { TransactionManager tm = factory.getTransactionManager(); try { - return ( tm!=null && isTransactionInProgress( tm.getTransaction() ) ); + return tm != null && isTransactionInProgress( tm.getTransaction() ); } catch (SystemException se) { throw new TransactionException( "could not obtain JTA Transaction", se ); Modified: trunk/Hibernate3/test/org/hibernate/test/connections/AggressiveReleaseTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/connections/AggressiveReleaseTest.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/connections/AggressiveReleaseTest.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -4,6 +4,7 @@ import org.hibernate.Session; import org.hibernate.ConnectionReleaseMode; import org.hibernate.ScrollableResults; +import org.hibernate.transaction.CMTTransactionFactory; import org.hibernate.impl.SessionImpl; import org.hibernate.util.SerializationHelper; import org.hibernate.test.tm.DummyConnectionProvider; @@ -16,6 +17,9 @@ import junit.framework.TestSuite; import java.sql.Connection; +import java.util.List; +import java.util.ArrayList; +import java.util.Iterator; /** * Implementation of AggressiveReleaseTest. @@ -33,9 +37,13 @@ } protected void configure(Configuration cfg) { + super.configure( cfg ); cfg.setProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.AFTER_STATEMENT.toString() ); cfg.setProperty( Environment.CONNECTION_PROVIDER, DummyConnectionProvider.class.getName() ); + cfg.setProperty( Environment.TRANSACTION_STRATEGY, CMTTransactionFactory.class.getName() ); cfg.setProperty( Environment.TRANSACTION_MANAGER_STRATEGY, DummyTransactionManagerLookup.class.getName() ); + cfg.setProperty( Environment.GENERATE_STATISTICS, "true" ); + cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" ); } protected Session getSessionUnderTest() throws Throwable { @@ -144,4 +152,35 @@ release( s ); done(); } + + public void testConnectionMaintanenceDuringFlush() throws Throwable { + prepare(); + Session s = getSessionUnderTest(); + s.beginTransaction(); + + List entities = new ArrayList(); + for ( int i = 0; i < 10; i++ ) { + Other other = new Other( "other-" + i ); + Silly silly = new Silly( "silly-" + i, other ); + entities.add( silly ); + s.save( silly ); + } + s.flush(); + + Iterator itr = entities.iterator(); + while ( itr.hasNext() ) { + Silly silly = ( Silly ) itr.next(); + silly.setName( "new-" + silly.getName() ); + silly.getOther().setName( "new-" + silly.getOther().getName() ); + } + long initialCount = getSessions().getStatistics().getConnectCount(); + s.flush(); + assertEquals( "connection not maintained through flush", initialCount + 1, getSessions().getStatistics().getConnectCount() ); + + s.createQuery( "delete from Silly" ).executeUpdate(); + s.createQuery( "delete from Other" ).executeUpdate(); + s.getTransaction().commit(); + release( s ); + done(); + } } Modified: trunk/Hibernate3/test/org/hibernate/test/connections/BasicConnectionProviderTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/connections/BasicConnectionProviderTest.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/connections/BasicConnectionProviderTest.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -33,6 +33,7 @@ } protected void configure(Configuration cfg) { + super.configure( cfg ); cfg.setProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.ON_CLOSE.toString() ); } } Modified: trunk/Hibernate3/test/org/hibernate/test/connections/ConnectionManagementTestCase.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/connections/ConnectionManagementTestCase.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/connections/ConnectionManagementTestCase.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -4,6 +4,8 @@ import org.hibernate.test.TestCase; import org.hibernate.Session; import org.hibernate.Transaction; +import org.hibernate.cfg.Configuration; +import org.hibernate.cfg.Environment; import org.hibernate.util.SerializationHelper; /** @@ -28,6 +30,9 @@ return new String[] { "connections/Silly.hbm.xml" }; } + protected void configure(Configuration cfg) { + super.configure( cfg ); + } // hooks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Modified: trunk/Hibernate3/test/org/hibernate/test/connections/CurrentSessionConnectionTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/connections/CurrentSessionConnectionTest.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/connections/CurrentSessionConnectionTest.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -2,10 +2,6 @@ package org.hibernate.test.connections; import org.hibernate.Session; -import org.hibernate.test.tm.DummyConnectionProvider; -import org.hibernate.test.tm.DummyTransactionManagerLookup; -import org.hibernate.cfg.Configuration; -import org.hibernate.cfg.Environment; import junit.framework.Test; import junit.framework.TestSuite; Added: trunk/Hibernate3/test/org/hibernate/test/connections/Other.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/connections/Other.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/connections/Other.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -0,0 +1,32 @@ +package org.hibernate.test.connections; + +/** + * @author Steve Ebersole + */ +public class Other { + private Long id; + private String name; + + public Other() { + } + + public Other(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} Modified: trunk/Hibernate3/test/org/hibernate/test/connections/Silly.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/connections/Silly.hbm.xml 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/connections/Silly.hbm.xml 2006-03-10 18:14:21 UTC (rev 9595) @@ -10,6 +10,14 @@ <generator class="native"/> </id> <property name="name"/> + <many-to-one name="other" class="Other" cascade="all"/> + </class> + + <class name="Other"> + <id name="id" type="long"> + <generator class="native"/> + </id> + <property name="name"/> </class> </hibernate-mapping> \ No newline at end of file Modified: trunk/Hibernate3/test/org/hibernate/test/connections/Silly.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/connections/Silly.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/connections/Silly.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -11,6 +11,7 @@ public class Silly implements Serializable { private Long id; private String name; + private Other other; public Silly() { } @@ -19,6 +20,11 @@ this.name = name; } + public Silly(String name, Other other) { + this.name = name; + this.other = other; + } + public Long getId() { return id; } @@ -34,4 +40,12 @@ public void setName(String name) { this.name = name; } + + public Other getOther() { + return other; + } + + public void setOther(Other other) { + this.other = other; + } } Modified: trunk/Hibernate3/test/org/hibernate/test/connections/SuppliedConnectionTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/connections/SuppliedConnectionTest.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/connections/SuppliedConnectionTest.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -48,6 +48,7 @@ } protected void configure(Configuration cfg) { + super.configure( cfg ); cfg.setProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.ON_CLOSE.toString() ); cfg.setProperty( Environment.CONNECTION_PROVIDER, UserSuppliedConnectionProvider.class.getName() ); boolean supportsScroll = true; Modified: trunk/Hibernate3/test/org/hibernate/test/connections/ThreadLocalCurrentSessionTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/connections/ThreadLocalCurrentSessionTest.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/connections/ThreadLocalCurrentSessionTest.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -17,6 +17,7 @@ } protected void configure(Configuration cfg) { + super.configure( cfg ); cfg.setProperty( Environment.CURRENT_SESSION_CONTEXT_CLASS, TestableThreadLocalContext.class.getName() ); cfg.setProperty( Environment.GENERATE_STATISTICS, "true" ); } Modified: trunk/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -28,7 +28,7 @@ super(str); } - public void testFInalizeFiltered() { + public void testFinalizeFiltered() { Session s = openSession(); Transaction t = s.beginTransaction(); @@ -199,6 +199,7 @@ dp2 = (DataPoint) s.createQuery("from DataPoint").uniqueResult(); assertSame(dp, dp2); assertTrue( Hibernate.isInitialized(dp) ); + s.delete( dp ); t.commit(); s.close(); } Modified: trunk/Hibernate3/test/org/hibernate/test/tm/CMTTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/tm/CMTTest.java 2006-03-10 17:09:27 UTC (rev 9594) +++ trunk/Hibernate3/test/org/hibernate/test/tm/CMTTest.java 2006-03-10 18:14:21 UTC (rev 9595) @@ -15,6 +15,7 @@ import org.hibernate.Session; import org.hibernate.ScrollableResults; import org.hibernate.ConnectionReleaseMode; +import org.hibernate.transaction.CMTTransactionFactory; import org.hibernate.util.SerializationHelper; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; @@ -379,7 +380,7 @@ public void testCurrentSessionWithScroll() throws Exception { DummyTransactionManager.INSTANCE.begin(); - Session s = openSession(); + Session s = getSessions().getCurrentSession(); Map item1 = new HashMap(); item1.put( "name", "Item - 1" ); item1.put( "description", "The first item" ); @@ -391,13 +392,21 @@ s.persist( "Item", item2 ); DummyTransactionManager.INSTANCE.getTransaction().commit(); - // First, test partially scrolling the result (w/o closing) + // First, test partially scrolling the result with out closing DummyTransactionManager.INSTANCE.begin(); s = getSessions().getCurrentSession(); ScrollableResults results = s.createQuery( "from Item" ).scroll(); results.next(); DummyTransactionManager.INSTANCE.getTransaction().commit(); + // Next, test partially scrolling the result with closing + DummyTransactionManager.INSTANCE.begin(); + s = getSessions().getCurrentSession(); + results = s.createQuery( "from Item" ).scroll(); + results.next(); + results.close(); + DummyTransactionManager.INSTANCE.getTransaction().commit(); + // Next, scroll the entire result (w/o closing) DummyTransactionManager.INSTANCE.begin(); s = getSessions().getCurrentSession(); @@ -407,6 +416,7 @@ } DummyTransactionManager.INSTANCE.getTransaction().commit(); + // Next, scroll the entire result (closing) DummyTransactionManager.INSTANCE.begin(); s = getSessions().getCurrentSession(); results = s.createQuery( "from Item" ).scroll(); @@ -417,7 +427,7 @@ DummyTransactionManager.INSTANCE.getTransaction().commit(); DummyTransactionManager.INSTANCE.begin(); - s = openSession(); + s = getSessions().getCurrentSession(); s.createQuery( "delete from Item" ).executeUpdate(); DummyTransactionManager.INSTANCE.getTransaction().commit(); } @@ -480,14 +490,15 @@ } protected void configure(Configuration cfg) { - cfg.setProperty(Environment.CONNECTION_PROVIDER, DummyConnectionProvider.class.getName()); - cfg.setProperty(Environment.TRANSACTION_MANAGER_STRATEGY, DummyTransactionManagerLookup.class.getName()); - cfg.setProperty(Environment.AUTO_CLOSE_SESSION, "true"); - cfg.setProperty(Environment.FLUSH_BEFORE_COMPLETION, "true"); - cfg.setProperty(Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.AFTER_STATEMENT.toString()); - cfg.setProperty(Environment.GENERATE_STATISTICS, "true"); - cfg.setProperty(Environment.USE_QUERY_CACHE, "true"); - cfg.setProperty(Environment.DEFAULT_ENTITY_MODE, EntityMode.MAP.toString()); + cfg.setProperty( Environment.CONNECTION_PROVIDER, DummyConnectionProvider.class.getName() ); + cfg.setProperty( Environment.TRANSACTION_MANAGER_STRATEGY, DummyTransactionManagerLookup.class.getName() ); + cfg.setProperty( Environment.TRANSACTION_STRATEGY, CMTTransactionFactory.class.getName() ); + cfg.setProperty( Environment.AUTO_CLOSE_SESSION, "true" ); + cfg.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "true" ); + cfg.setProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.AFTER_STATEMENT.toString() ); + cfg.setProperty( Environment.GENERATE_STATISTICS, "true" ); + cfg.setProperty( Environment.USE_QUERY_CACHE, "true" ); + cfg.setProperty( Environment.DEFAULT_ENTITY_MODE, EntityMode.MAP.toString() ); } } |
From: <hib...@li...> - 2006-03-10 17:09:31
|
Author: ste...@jb... Date: 2006-03-10 12:09:27 -0500 (Fri, 10 Mar 2006) New Revision: 9594 Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Other.java Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/AggressiveReleaseTest.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Silly.hbm.xml branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Silly.java Log: HHH-1555 : maintain connections during flush even with aggressive release Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/AggressiveReleaseTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/AggressiveReleaseTest.java 2006-03-10 17:08:38 UTC (rev 9593) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/AggressiveReleaseTest.java 2006-03-10 17:09:27 UTC (rev 9594) @@ -4,6 +4,7 @@ import org.hibernate.Session; import org.hibernate.ConnectionReleaseMode; import org.hibernate.ScrollableResults; +import org.hibernate.transaction.CMTTransactionFactory; import org.hibernate.impl.SessionImpl; import org.hibernate.util.SerializationHelper; import org.hibernate.test.tm.DummyConnectionProvider; @@ -16,6 +17,9 @@ import junit.framework.TestSuite; import java.sql.Connection; +import java.util.List; +import java.util.ArrayList; +import java.util.Iterator; /** * Implementation of AggressiveReleaseTest. @@ -33,9 +37,13 @@ } protected void configure(Configuration cfg) { + super.configure( cfg ); cfg.setProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.AFTER_STATEMENT.toString() ); cfg.setProperty( Environment.CONNECTION_PROVIDER, DummyConnectionProvider.class.getName() ); + cfg.setProperty( Environment.TRANSACTION_STRATEGY, CMTTransactionFactory.class.getName() ); cfg.setProperty( Environment.TRANSACTION_MANAGER_STRATEGY, DummyTransactionManagerLookup.class.getName() ); + cfg.setProperty( Environment.GENERATE_STATISTICS, "true" ); + cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" ); } protected Session getSessionUnderTest() throws Throwable { @@ -144,4 +152,35 @@ release( s ); done(); } + + public void testConnectionMaintanenceDuringFlush() throws Throwable { + prepare(); + Session s = getSessionUnderTest(); + s.beginTransaction(); + + List entities = new ArrayList(); + for ( int i = 0; i < 10; i++ ) { + Other other = new Other( "other-" + i ); + Silly silly = new Silly( "silly-" + i, other ); + entities.add( silly ); + s.save( silly ); + } + s.flush(); + + Iterator itr = entities.iterator(); + while ( itr.hasNext() ) { + Silly silly = ( Silly ) itr.next(); + silly.setName( "new-" + silly.getName() ); + silly.getOther().setName( "new-" + silly.getOther().getName() ); + } + long initialCount = getSessions().getStatistics().getConnectCount(); + s.flush(); + assertEquals( "connection not maintained through flush", initialCount + 1, getSessions().getStatistics().getConnectCount() ); + + s.createQuery( "delete from Silly" ).executeUpdate(); + s.createQuery( "delete from Other" ).executeUpdate(); + s.getTransaction().commit(); + release( s ); + done(); + } } Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Other.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Other.java 2006-03-10 17:08:38 UTC (rev 9593) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Other.java 2006-03-10 17:09:27 UTC (rev 9594) @@ -0,0 +1,32 @@ +package org.hibernate.test.connections; + +/** + * @author Steve Ebersole + */ +public class Other { + private Long id; + private String name; + + public Other() { + } + + public Other(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Silly.hbm.xml =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Silly.hbm.xml 2006-03-10 17:08:38 UTC (rev 9593) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Silly.hbm.xml 2006-03-10 17:09:27 UTC (rev 9594) @@ -10,6 +10,14 @@ <generator class="native"/> </id> <property name="name"/> + <many-to-one name="other" class="Other" cascade="all"/> + </class> + + <class name="Other"> + <id name="id" type="long"> + <generator class="native"/> + </id> + <property name="name"/> </class> </hibernate-mapping> \ No newline at end of file Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Silly.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Silly.java 2006-03-10 17:08:38 UTC (rev 9593) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/connections/Silly.java 2006-03-10 17:09:27 UTC (rev 9594) @@ -11,6 +11,7 @@ public class Silly implements Serializable { private Long id; private String name; + private Other other; public Silly() { } @@ -19,6 +20,11 @@ this.name = name; } + public Silly(String name, Other other) { + this.name = name; + this.other = other; + } + public Long getId() { return id; } @@ -34,4 +40,12 @@ public void setName(String name) { this.name = name; } + + public Other getOther() { + return other; + } + + public void setOther(Other other) { + this.other = other; + } } |
From: <hib...@li...> - 2006-03-10 17:08:41
|
Author: ste...@jb... Date: 2006-03-10 12:08:38 -0500 (Fri, 10 Mar 2006) New Revision: 9593 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java branches/Branch_3_1/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java Log: HHH-1555 : maintain connections during flush even with aggressive release Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java 2006-03-10 09:47:11 UTC (rev 9592) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/event/def/AbstractFlushingEventListener.java 2006-03-10 17:08:38 UTC (rev 9593) @@ -289,6 +289,7 @@ log.trace("executing flush"); try { + session.getJDBCContext().getConnectionManager().flushBeginning(); // we need to lock the collection caches before // executing entity inserts/updates in order to // account for bidi associations @@ -299,6 +300,9 @@ log.error("Could not synchronize database state with session", he); throw he; } + finally { + session.getJDBCContext().getConnectionManager().flushEnding(); + } } Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java 2006-03-10 09:47:11 UTC (rev 9592) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/jdbc/ConnectionManager.java 2006-03-10 17:08:38 UTC (rev 9593) @@ -46,6 +46,7 @@ private transient Batcher batcher; private transient Interceptor interceptor; private boolean isClosed; + private transient boolean isFlushing; /** * Constructs a ConnectionManager. @@ -261,7 +262,10 @@ */ public void afterStatement() { if ( isAggressiveRelease() ) { - if ( batcher.hasOpenResources() ) { + if ( isFlushing ) { + log.debug( "skipping aggressive-release due to flush cycle" ); + } + else if ( batcher.hasOpenResources() ) { log.debug( "skipping aggresive-release due to open resources on batcher" ); } else if ( borrowedConnection != null ) { @@ -450,6 +454,26 @@ } } + /** + * Callback to let us know that a flush is beginning. We use this fact + * to temporarily circumvent aggressive connection releasing until after + * the flush cycle is complete {@link #flushEnding()} + */ + public void flushBeginning() { + log.trace( "registering flush begin" ); + isFlushing = true; + } + + /** + * Callback to let us know that a flush is ending. We use this fact to + * stop circumventing aggressive releasing connections. + */ + public void flushEnding() { + log.trace( "registering flush end" ); + isFlushing = false; + afterStatement(); + } + public boolean isReadyForSerialization() { return wasConnectionSupplied ? connection == null : !batcher.hasOpenResources(); } |
From: <hib...@li...> - 2006-03-10 09:47:29
|
Author: epbernard Date: 2006-03-10 04:47:11 -0500 (Fri, 10 Mar 2006) New Revision: 9592 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java Log: typo Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java 2006-03-10 03:18:49 UTC (rev 9591) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java 2006-03-10 09:47:11 UTC (rev 9592) @@ -32,7 +32,7 @@ public String foreignKeyColumnName(String propertyName, String propertyTableName, String referencedColumnName) { String header = propertyName != null ? addUnderscores( propertyName ) : propertyTableName; - if (header == null) throw new AssertionFailure("NammingStrategy not properly filled"); + if (header == null) throw new AssertionFailure("NamingStrategy not properly filled"); return columnName( header + "_" + referencedColumnName ); } |
From: <hib...@li...> - 2006-03-10 03:18:53
|
Author: ste...@jb... Date: 2006-03-09 22:18:49 -0500 (Thu, 09 Mar 2006) New Revision: 9591 Modified: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml Log: mapping bug Modified: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml 2006-03-10 00:35:01 UTC (rev 9590) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml 2006-03-10 03:18:49 UTC (rev 9591) @@ -57,7 +57,7 @@ <property name="name" not-null="true" length="50"/> <property name="upperCaseName" formula="upper(name)" lazy="true"/> <property name="summary" not-null="true" length="200" lazy="true"/> - <many-to-one name="folder" not-null="true" lazy="true"/> + <many-to-one name="folder" not-null="true" lazy="no-proxy"/> <many-to-one name="owner" not-null="true" lazy="no-proxy" fetch="select"/> <property name="text" not-null="true" length="2000" lazy="true"/> <property name="lastTextModification" not-null="true" lazy="true" access="field"/> |
From: <hib...@li...> - 2006-03-10 00:35:20
|
Author: epbernard Date: 2006-03-09 19:35:01 -0500 (Thu, 09 Mar 2006) New Revision: 9590 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java Log: Support persistence provider classes ending with .class Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java 2006-03-10 00:33:43 UTC (rev 9589) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java 2006-03-10 00:35:01 UTC (rev 9590) @@ -66,6 +66,9 @@ } public void setProvider(String provider) { + if ( provider != null && provider.endsWith( ".class" ) ) { + this.provider = provider.substring( 0, provider.length() - 6 ); + } this.provider = provider; } |
From: <hib...@li...> - 2006-03-10 00:34:04
|
Author: epbernard Date: 2006-03-09 19:33:43 -0500 (Thu, 09 Mar 2006) New Revision: 9589 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java Log: EJB-143 check that the persistence provider is the right one when processing pui Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-09 21:39:21 UTC (rev 9588) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-10 00:33:43 UTC (rev 9589) @@ -35,6 +35,9 @@ import org.hibernate.Interceptor; import org.hibernate.MappingException; import org.hibernate.SessionFactory; +import org.hibernate.AssertionFailure; +import org.hibernate.transaction.JTATransactionFactory; +import org.hibernate.transaction.JDBCTransactionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; @@ -216,6 +219,11 @@ else { log.info( "Processing PersistenceUnitInfo [\n\tname: " + info.getPersistenceUnitName() + "\n\t...]" ); } + if ( info.getPersistenceProviderClassName() != null + && ! info.getPersistenceProviderClassName().trim().startsWith( IMPLEMENTATION_NAME ) ) { + log.info( "Required a different provider: " + info.getPersistenceProviderClassName() ); + return null; + } if ( info.getClassLoader() == null ) { throw new IllegalStateException("PersistenceUnitInfo.getClassLoader() id null"); } @@ -449,25 +457,127 @@ private EntityManagerFactory createEntityManagerFactory( Properties properties, Map workingVars ) { - Properties preparedProperties = new Properties(); + Properties preparedProperties = prepareProperties( properties, workingVars ); + if ( workingVars == null ) workingVars = CollectionHelper.EMPTY_MAP; - //defaults different to Hibernate - preparedProperties.setProperty( Environment.RELEASE_CONNECTIONS, "auto" ); - //settings that always apply to a compliant EJB3 - preparedProperties.setProperty( Environment.AUTOCOMMIT, "true" ); - preparedProperties.setProperty( Environment.USE_IDENTIFIER_ROLLBACK, "false" ); - preparedProperties.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "true" ); + if ( preparedProperties.containsKey( HibernatePersistence.CFG_FILE ) ) { + String cfgFileName = preparedProperties.getProperty( HibernatePersistence.CFG_FILE ); + cfg.configure( cfgFileName ); + } - //override the new defaults with the user defined ones - if ( properties != null ) preparedProperties.putAll( properties ); + cfg.addProperties( preparedProperties ); //persistence.xml has priority over hibernate.Cfg.xml - if ( properties != null && properties.containsKey( HibernatePersistence.CFG_FILE ) ) { - String cfgFileName = properties.getProperty( HibernatePersistence.CFG_FILE ); - cfg.configure( cfgFileName ); + addClassesToSessionFactory( workingVars ); + + //processes specific properties + List<String> jaccKeys = new ArrayList<String>(); + + + Configuration defaultConf = new AnnotationConfiguration(); + Interceptor defaultInterceptor = defaultConf.getInterceptor(); + NamingStrategy defaultNamingStrategy = defaultConf.getNamingStrategy(); + + Iterator propertyIt = preparedProperties.keySet().iterator(); + while ( propertyIt.hasNext() ) { + Object uncastObject = propertyIt.next(); + //had to be safe + if ( uncastObject != null && uncastObject instanceof String ) { + String propertyKey = (String) uncastObject; + if ( propertyKey.startsWith( HibernatePersistence.CLASS_CACHE_PREFIX ) ) { + setCacheStrategy( propertyKey, preparedProperties, true ); + } + else if ( propertyKey.startsWith( HibernatePersistence.COLLECTION_CACHE_PREFIX ) ) { + setCacheStrategy( propertyKey, preparedProperties, false ); + } + else if ( propertyKey.startsWith( HibernatePersistence.JACC_PREFIX ) + && ! ( propertyKey.equals( HibernatePersistence.JACC_CONTEXT_ID ) + || propertyKey.equals( HibernatePersistence.JACC_ENABLED ) ) ) { + jaccKeys.add( propertyKey ); + } + } } + if ( preparedProperties.containsKey( HibernatePersistence.INTERCEPTOR ) + && ( cfg.getInterceptor() == null + || cfg.getInterceptor().equals( defaultInterceptor ) ) ) { + //cfg.setInterceptor has precedence over configuration file + String interceptorName = preparedProperties.getProperty( HibernatePersistence.INTERCEPTOR ); + try { + Class interceptor = classForName( interceptorName ); + cfg.setInterceptor( (Interceptor) interceptor.newInstance() ); + } + catch (ClassNotFoundException e) { + throw new PersistenceException( "Unable to find interceptor class: " + interceptorName, e ); + } + catch (IllegalAccessException e) { + throw new PersistenceException( + "Unable to access interceptor class: " + interceptorName, e + ); + } + catch (InstantiationException e) { + throw new PersistenceException( + "Unable to instanciate interceptor class: " + interceptorName, e + ); + } + catch (ClassCastException e) { + throw new PersistenceException( + "Interceptor class does not implement Interceptor interface: " + interceptorName, e + ); + } + } + if ( preparedProperties.containsKey( HibernatePersistence.NAMING_STRATEGY ) + && ( cfg.getNamingStrategy() == null + || cfg.getNamingStrategy().equals( defaultNamingStrategy ) ) ) { + //cfg.setNamingStrategy has precedence over configuration file + String namingStrategyName = preparedProperties.getProperty( HibernatePersistence.NAMING_STRATEGY ); + try { + Class namingStragegy = classForName( namingStrategyName ); + cfg.setNamingStrategy( (NamingStrategy) namingStragegy.newInstance() ); + } + catch (ClassNotFoundException e) { + throw new PersistenceException( + "Unable to find naming strategy class: " + namingStrategyName, e + ); + } + catch (IllegalAccessException e) { + throw new PersistenceException( + "Unable to access naming strategy class: " + namingStrategyName, e + ); + } + catch (InstantiationException e) { + throw new PersistenceException( + "Unable to instanciate naming strategy class: " + namingStrategyName, e + ); + } + catch (ClassCastException e) { + throw new PersistenceException( + "Naming strategyy class does not implement NmaingStrategy interface: " + namingStrategyName, + e + ); + } + } - cfg.addProperties( preparedProperties ); - if ( workingVars == null ) workingVars = CollectionHelper.EMPTY_MAP; + if ( jaccKeys.size() > 0 ) { + addSecurity( jaccKeys, preparedProperties ); + } + + //initialize listeners + listenerConfigurator.setProperties( preparedProperties ); + listenerConfigurator.setValidator( true ); + listenerConfigurator.configure(); + + //some spec compliance checking + //TODO centralize that? + if ( ! "true".equalsIgnoreCase( cfg.getProperty( Environment.AUTOCOMMIT ) ) ) { + log.warn( Environment.AUTOCOMMIT + " = false break the EJB3 specification" ); + } + boolean discardOnClose = preparedProperties.getProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE).equals( "true"); + return buildEntityManagerFactory( + (PersistenceUnitTransactionType) workingVars.get(HibernatePersistence.TRANSACTION_TYPE), + discardOnClose + ); + } + + private void addClassesToSessionFactory(Map workingVars) { if ( workingVars.containsKey( HibernatePersistence.CLASS_NAMES ) ) { Collection<String> classNames = (Collection<String>) workingVars.get( HibernatePersistence.CLASS_NAMES @@ -497,114 +607,33 @@ cfg.addInputStream( is ); } } + } - //processes specific properties - List<String> jaccKeys = new ArrayList<String>(); + private Properties prepareProperties(Properties properties, Map workingVars ) { + Properties preparedProperties = new Properties(); - if ( properties != null ) { - Configuration defaultConf = new AnnotationConfiguration(); - Interceptor defaultInterceptor = defaultConf.getInterceptor(); - NamingStrategy defaultNamingStrategy = defaultConf.getNamingStrategy(); - - Iterator propertyIt = properties.keySet().iterator(); - while ( propertyIt.hasNext() ) { - Object uncastObject = propertyIt.next(); - //had to be safe - if ( uncastObject != null && uncastObject instanceof String ) { - String propertyKey = (String) uncastObject; - if ( propertyKey.startsWith( HibernatePersistence.CLASS_CACHE_PREFIX ) ) { - setCacheStrategy( propertyKey, properties, true ); - } - else if ( propertyKey.startsWith( HibernatePersistence.COLLECTION_CACHE_PREFIX ) ) { - setCacheStrategy( propertyKey, properties, false ); - } - else if ( propertyKey.startsWith( HibernatePersistence.JACC_PREFIX ) - && ! ( propertyKey.equals( HibernatePersistence.JACC_CONTEXT_ID ) - || propertyKey.equals( HibernatePersistence.JACC_ENABLED ) ) ) { - jaccKeys.add( propertyKey ); - } - else if ( propertyKey.equals( HibernatePersistence.INTERCEPTOR ) - && ( cfg.getInterceptor() == null - || cfg.getInterceptor().equals( defaultInterceptor ) ) ) { - //cfg.setInterceptor has precedence over configuration file - String interceptorName = properties.getProperty( HibernatePersistence.INTERCEPTOR ); - try { - Class interceptor = classForName( interceptorName ); - cfg.setInterceptor( (Interceptor) interceptor.newInstance() ); - } - catch (ClassNotFoundException e) { - throw new PersistenceException( "Unable to find interceptor class: " + interceptorName, e ); - } - catch (IllegalAccessException e) { - throw new PersistenceException( - "Unable to access interceptor class: " + interceptorName, e - ); - } - catch (InstantiationException e) { - throw new PersistenceException( - "Unable to instanciate interceptor class: " + interceptorName, e - ); - } - catch (ClassCastException e) { - throw new PersistenceException( - "Interceptor class does not implement Interceptor interface: " + interceptorName, e - ); - } - } - else if ( propertyKey.equals( HibernatePersistence.NAMING_STRATEGY ) - && ( cfg.getNamingStrategy() == null - || cfg.getNamingStrategy().equals( defaultNamingStrategy ) ) ) { - //cfg.setNamingStrategy has precedence over configuration file - String namingStrategyName = properties.getProperty( HibernatePersistence.NAMING_STRATEGY ); - try { - Class namingStragegy = classForName( namingStrategyName ); - cfg.setNamingStrategy( (NamingStrategy) namingStragegy.newInstance() ); - } - catch (ClassNotFoundException e) { - throw new PersistenceException( - "Unable to find naming strategy class: " + namingStrategyName, e - ); - } - catch (IllegalAccessException e) { - throw new PersistenceException( - "Unable to access naming strategy class: " + namingStrategyName, e - ); - } - catch (InstantiationException e) { - throw new PersistenceException( - "Unable to instanciate naming strategy class: " + namingStrategyName, e - ); - } - catch (ClassCastException e) { - throw new PersistenceException( - "Naming strategyr class does not implement NmaingStrategy interface: " + namingStrategyName, - e - ); - } - } - } - } + //defaults different to Hibernate + preparedProperties.setProperty( Environment.RELEASE_CONNECTIONS, "auto" ); + //settings that always apply to a compliant EJB3 + preparedProperties.setProperty( Environment.AUTOCOMMIT, "true" ); + preparedProperties.setProperty( Environment.USE_IDENTIFIER_ROLLBACK, "false" ); + preparedProperties.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "true" ); + preparedProperties.setProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE, "false" ); + PersistenceUnitTransactionType type = (PersistenceUnitTransactionType) + workingVars.get(HibernatePersistence.TRANSACTION_TYPE); + if (type == PersistenceUnitTransactionType.JTA) { + preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JTATransactionFactory.class.getName() ); } - - if ( jaccKeys.size() > 0 ) { - addSecurity( jaccKeys, properties ); + else if (type == PersistenceUnitTransactionType.RESOURCE_LOCAL) { + preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JDBCTransactionFactory.class.getName() ); } + else { + new AssertionFailure("Unknown PersisntenceUnitTransactionType: " + type); + } - //initialize listeners - listenerConfigurator.setProperties( preparedProperties ); - listenerConfigurator.setValidator( true ); - listenerConfigurator.configure(); - - //some spec compliance checking - //TODO centralize that? - if ( ! "true".equalsIgnoreCase( cfg.getProperty( Environment.AUTOCOMMIT ) ) ) { - log.warn( Environment.AUTOCOMMIT + " = false break the EJB3 specification" ); - } - boolean discardOnClose = properties.getProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE, "false" ).equals( "true"); - return buildEntityManagerFactory( - (PersistenceUnitTransactionType) workingVars.get(HibernatePersistence.TRANSACTION_TYPE), - discardOnClose - ); + //override the new defaults with the user defined ones + if ( properties != null ) preparedProperties.putAll( properties ); + return preparedProperties; } private Class classForName( |
From: <hib...@li...> - 2006-03-09 21:39:23
|
Author: ste...@jb... Date: 2006-03-09 16:39:21 -0500 (Thu, 09 Mar 2006) New Revision: 9588 Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java Log: test suite cleanup Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java 2006-03-09 21:38:26 UTC (rev 9587) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java 2006-03-09 21:39:21 UTC (rev 9588) @@ -225,8 +225,8 @@ Session s = openSession(); Transaction t = s.beginTransaction(); Long lastContainerId = null; - int containerCount = 200; - int nestedDataPointCount = 50; + int containerCount = 10; + int nestedDataPointCount = 5; for ( int c_indx = 0; c_indx < containerCount; c_indx++ ) { Owner owner = new Owner( "Owner #" + c_indx ); Container container = new Container( "Container #" + c_indx ); @@ -234,7 +234,9 @@ for ( int dp_indx = 0; dp_indx < nestedDataPointCount; dp_indx++ ) { DataPoint dp = new DataPoint(); dp.setDescription( "data-point [" + c_indx + ", " + dp_indx + "]" ); - dp.setX( new BigDecimal( c_indx ) ); +// more HSQLDB fun... +// dp.setX( new BigDecimal( c_indx ) ); + dp.setX( new BigDecimal( c_indx + dp_indx ) ); dp.setY( new BigDecimal( dp_indx ) ); container.getDataPoints().add( dp ); } @@ -256,7 +258,7 @@ .list(); Container container = ( Container ) all.get( 0 ); s.delete( container ); - // for a snapshot retrieval of the proxied container + // force a snapshot retrieval of the proxied container SessionImpl sImpl = ( SessionImpl ) s; sImpl.getPersistenceContext().getDatabaseSnapshot( lastContainerId, @@ -265,27 +267,32 @@ assertFalse( Hibernate.isInitialized( proxy ) ); t.commit(); - int iterations = 50; - long cumulativeTime = 0; - long cumulativeSize = 0; - for ( int i = 0; i < iterations; i++ ) { - final long start = System.currentTimeMillis(); - byte[] bytes = SerializationHelper.serialize( s ); - SerializationHelper.deserialize( bytes ); - final long end = System.currentTimeMillis(); - cumulativeTime += ( end - start ); - int size = bytes.length; - cumulativeSize += size; -// System.out.println( "Iteration #" + i + " took " + ( end - start ) + " ms : size = " + size + " bytes" ); - } - System.out.println( "Average time : " + ( cumulativeTime / iterations ) + " ms" ); - System.out.println( "Average size : " + ( cumulativeSize / iterations ) + " bytes" ); +// int iterations = 50; +// long cumulativeTime = 0; +// long cumulativeSize = 0; +// for ( int i = 0; i < iterations; i++ ) { +// final long start = System.currentTimeMillis(); +// byte[] bytes = SerializationHelper.serialize( s ); +// SerializationHelper.deserialize( bytes ); +// final long end = System.currentTimeMillis(); +// cumulativeTime += ( end - start ); +// int size = bytes.length; +// cumulativeSize += size; +//// System.out.println( "Iteration #" + i + " took " + ( end - start ) + " ms : size = " + size + " bytes" ); +// } +// System.out.println( "Average time : " + ( cumulativeTime / iterations ) + " ms" ); +// System.out.println( "Average size : " + ( cumulativeSize / iterations ) + " bytes" ); + byte[] bytes = SerializationHelper.serialize( s ); + SerializationHelper.deserialize( bytes ); + t = s.beginTransaction(); int count = s.createQuery( "delete DataPoint" ).executeUpdate(); assertEquals( "unexpected DP delete count", ( containerCount * nestedDataPointCount ), count ); count = s.createQuery( "delete Container" ).executeUpdate(); assertEquals( "unexpected container delete count", containerCount, count ); + count = s.createQuery( "delete Owner" ).executeUpdate(); + assertEquals( "unexpected owner delete count", containerCount, count ); t.commit(); s.close(); } |
Author: ste...@jb... Date: 2006-03-09 16:38:26 -0500 (Thu, 09 Mar 2006) New Revision: 9587 Removed: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBTest.java trunk/Hibernate3/test/org/hibernate/test/querycache/Part.java Modified: trunk/Hibernate3/test/org/hibernate/test/cache/BaseCacheProviderTestCase.java trunk/Hibernate3/test/org/hibernate/test/cache/treecache/optimistic/OptimisticTreeCacheTest.java trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml trunk/Hibernate3/test/org/hibernate/test/legacy/MultiTableTest.java trunk/Hibernate3/test/org/hibernate/test/legacy/ParentChildTest.java trunk/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java trunk/Hibernate3/test/org/hibernate/test/querycache/Item.hbm.xml trunk/Hibernate3/test/org/hibernate/test/querycache/Item.java trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java Log: test suite cleanup; prep for joinTransaction() work Modified: trunk/Hibernate3/test/org/hibernate/test/cache/BaseCacheProviderTestCase.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/cache/BaseCacheProviderTestCase.java 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/cache/BaseCacheProviderTestCase.java 2006-03-09 21:38:26 UTC (rev 9587) @@ -196,8 +196,4 @@ s.close(); } - - protected SessionFactoryImplementor sfi() { - return ( SessionFactoryImplementor ) getSessions(); - } } Modified: trunk/Hibernate3/test/org/hibernate/test/cache/treecache/optimistic/OptimisticTreeCacheTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/cache/treecache/optimistic/OptimisticTreeCacheTest.java 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/cache/treecache/optimistic/OptimisticTreeCacheTest.java 2006-03-09 21:38:26 UTC (rev 9587) @@ -108,8 +108,4 @@ return option; } } - - public SessionFactoryImplementor sfi() { - return ( SessionFactoryImplementor ) getSessions(); - } } Modified: trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/domain/Documents.hbm.xml 2006-03-09 21:38:26 UTC (rev 9587) @@ -57,7 +57,7 @@ <property name="name" not-null="true" length="50"/> <property name="upperCaseName" formula="upper(name)" lazy="true"/> <property name="summary" not-null="true" length="200" lazy="true"/> - <many-to-one name="folder" not-null="true" lazy="no-proxy"/> + <many-to-one name="folder" not-null="true" lazy="true"/> <many-to-one name="owner" not-null="true" lazy="no-proxy" fetch="select"/> <property name="text" not-null="true" length="2000" lazy="true"/> <property name="lastTextModification" not-null="true" lazy="true" access="field"/> Deleted: trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBTest.java 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/instrument/runtime/CGLIBTest.java 2006-03-09 21:38:26 UTC (rev 9587) @@ -1,13 +0,0 @@ -package org.hibernate.test.instrument.runtime; - -import org.hibernate.bytecode.BytecodeProvider; -import org.hibernate.bytecode.cglib.BytecodeProviderImpl; - -/** - * @author Steve Ebersole - */ -public class CGLIBTest extends AbstractTransformingClassLoaderInstrumentTestCase { - protected BytecodeProvider buildBytecodeProvider() { - return new BytecodeProviderImpl(); - } -} Modified: trunk/Hibernate3/test/org/hibernate/test/legacy/MultiTableTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/legacy/MultiTableTest.java 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/legacy/MultiTableTest.java 2006-03-09 21:38:26 UTC (rev 9587) @@ -31,6 +31,7 @@ public void testCriteria() throws Exception { Session s = openSession(); + Transaction t = s.beginTransaction(); Lower l = new Lower(); s.save(l); assertTrue( l==s.createCriteria(Top.class).uniqueResult() ); @@ -42,7 +43,7 @@ .createCriteria("another"); c.createCriteria("another").add( Expression.isNotNull("id") ); c.list(); - s.connection().commit(); + t.commit(); s.close(); } Modified: trunk/Hibernate3/test/org/hibernate/test/legacy/ParentChildTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/legacy/ParentChildTest.java 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/legacy/ParentChildTest.java 2006-03-09 21:38:26 UTC (rev 9587) @@ -72,25 +72,25 @@ public void testQueryOneToOne() throws Exception { Session s = openSession(); + Transaction t = s.beginTransaction(); Serializable id = s.save( new Parent() ); assertTrue( s.find("from Parent p left join fetch p.child").size()==1 ); - s.flush(); - s.connection().commit(); + t.commit(); s.close(); s = openSession(); + t = s.beginTransaction(); Parent p = (Parent) s.createQuery("from Parent p left join fetch p.child").uniqueResult(); assertTrue( p.getChild()==null ); s.find("from Parent p join p.child c where c.x > 0"); s.find("from Child c join c.parent p where p.x > 0"); - s.flush(); - s.connection().commit(); + t.commit(); s.close(); s = openSession(); + t = s.beginTransaction(); s.delete( s.get(Parent.class, id) ); - s.flush(); - s.connection().commit(); + t.commit(); s.close(); } Modified: trunk/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/proxy/ProxyTest.java 2006-03-09 21:38:26 UTC (rev 9587) @@ -225,8 +225,8 @@ Session s = openSession(); Transaction t = s.beginTransaction(); Long lastContainerId = null; - int containerCount = 200; - int nestedDataPointCount = 50; + int containerCount = 10; + int nestedDataPointCount = 5; for ( int c_indx = 0; c_indx < containerCount; c_indx++ ) { Owner owner = new Owner( "Owner #" + c_indx ); Container container = new Container( "Container #" + c_indx ); @@ -267,22 +267,25 @@ assertFalse( Hibernate.isInitialized( proxy ) ); t.commit(); - int iterations = 50; - long cumulativeTime = 0; - long cumulativeSize = 0; - for ( int i = 0; i < iterations; i++ ) { - final long start = System.currentTimeMillis(); - byte[] bytes = SerializationHelper.serialize( s ); - SerializationHelper.deserialize( bytes ); - final long end = System.currentTimeMillis(); - cumulativeTime += ( end - start ); - int size = bytes.length; - cumulativeSize += size; -// System.out.println( "Iteration #" + i + " took " + ( end - start ) + " ms : size = " + size + " bytes" ); - } - System.out.println( "Average time : " + ( cumulativeTime / iterations ) + " ms" ); - System.out.println( "Average size : " + ( cumulativeSize / iterations ) + " bytes" ); +// int iterations = 50; +// long cumulativeTime = 0; +// long cumulativeSize = 0; +// for ( int i = 0; i < iterations; i++ ) { +// final long start = System.currentTimeMillis(); +// byte[] bytes = SerializationHelper.serialize( s ); +// SerializationHelper.deserialize( bytes ); +// final long end = System.currentTimeMillis(); +// cumulativeTime += ( end - start ); +// int size = bytes.length; +// cumulativeSize += size; +//// System.out.println( "Iteration #" + i + " took " + ( end - start ) + " ms : size = " + size + " bytes" ); +// } +// System.out.println( "Average time : " + ( cumulativeTime / iterations ) + " ms" ); +// System.out.println( "Average size : " + ( cumulativeSize / iterations ) + " bytes" ); + byte[] bytes = SerializationHelper.serialize( s ); + SerializationHelper.deserialize( bytes ); + t = s.beginTransaction(); int count = s.createQuery( "delete DataPoint" ).executeUpdate(); assertEquals( "unexpected DP delete count", ( containerCount * nestedDataPointCount ), count ); Modified: trunk/Hibernate3/test/org/hibernate/test/querycache/Item.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/querycache/Item.hbm.xml 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/querycache/Item.hbm.xml 2006-03-09 21:38:26 UTC (rev 9587) @@ -12,17 +12,6 @@ </id> <property name="name" not-null="true"/> <property name="description" not-null="true"/> - <set name="parts" inverse="false" cascade="save-update" table="ITEM_PARTS" fetch="select"> - <key column="ITEM_ID"/> - <many-to-many class="Part" column="PART_ID"/> - </set> </class> - <class name="Part" table="Parts"> - <id name="id"> - <generator class="native"/> - </id> - <property name="name"/> - </class> - </hibernate-mapping> Modified: trunk/Hibernate3/test/org/hibernate/test/querycache/Item.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/querycache/Item.java 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/querycache/Item.java 2006-03-09 21:38:26 UTC (rev 9587) @@ -12,7 +12,6 @@ private long id; private String name; private String description; - private Set parts = new HashSet(); public String getDescription() { return description; @@ -32,12 +31,4 @@ public void setName(String name) { this.name = name; } - - public Set getParts() { - return parts; - } - - public void setParts(Set parts) { - this.parts = parts; - } } Deleted: trunk/Hibernate3/test/org/hibernate/test/querycache/Part.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/querycache/Part.java 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/querycache/Part.java 2006-03-09 21:38:26 UTC (rev 9587) @@ -1,25 +0,0 @@ -package org.hibernate.test.querycache; - -/** - * @author Steve Ebersole - */ -public class Part { - private Long id; - private String name; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} Modified: trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java 2006-03-09 21:11:44 UTC (rev 9586) +++ trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java 2006-03-09 21:38:26 UTC (rev 9587) @@ -234,77 +234,6 @@ } - public void testCollectionFetchCachingFailureExpected() throws Throwable { - getSessions().evictQueries(); - getSessions().getStatistics().clear(); - - final String queryString = "select distinct i from Item i join fetch i.parts"; - - Session s = openSession(); - Transaction t = s.beginTransaction(); - Item i = new Item(); - i.setName( "widget" ); - i.setDescription( "A really top-quality, full-featured widget." ); - Part p1 = new Part(); - p1.setName( "p1-1" ); - i.getParts().add( p1 ); - Part p2 = new Part(); - p2.setName( "part-2" ); - i.getParts().add( p2 ); - s.save( i ); - t.commit(); - s.close(); - - getSessions().evict( Item.class ); - - QueryStatistics qs = getSessions().getStatistics().getQueryStatistics( queryString ); - EntityStatistics es = getSessions().getStatistics().getEntityStatistics( Item.class.getName() ); - CollectionStatistics cs = getSessions().getStatistics().getCollectionStatistics( Item.class.getName() + ".parts" ); - - Thread.sleep(200); - - s = openSession(); - t = s.beginTransaction(); - List result = s.createQuery( queryString ).setCacheable( true ).list(); - assertEquals( result.size(), 1 ); - i = ( Item ) result.get( 0 ); - assertTrue( Hibernate.isInitialized( i ) ); - assertTrue( Hibernate.isInitialized( i.getParts() ) ); - t.commit(); - s.close(); - - assertEquals( qs.getCacheHitCount(), 0 ); - assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 ); - assertEquals( getSessions().getStatistics().getCollectionFetchCount(), 0 ); - - s = openSession(); - t = s.beginTransaction(); - result = s.createQuery( queryString ).setCacheable( true ).list(); - assertEquals( result.size(), 1 ); - i = ( Item ) result.get( 0 ); - assertTrue( Hibernate.isInitialized( i ) ); - // todo : this is the bug causing the failure expected (HHH-1543). - // when the query results are served from the query cache, - // collections are not forced to initialize - assertTrue( Hibernate.isInitialized( i.getParts() ) ); - t.commit(); - s.close(); - - assertEquals( qs.getCacheHitCount(), 1 ); - assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 ); - assertEquals( getSessions().getStatistics().getCollectionFetchCount(), 0 ); - assertEquals( es.getFetchCount(), 0 ); - assertEquals( cs.getFetchCount(), 0 ); - - s = openSession(); - t = s.beginTransaction(); - s.delete( i ); - s.flush(); - s.createQuery("delete Part").executeUpdate(); - t.commit(); - s.close(); - } - protected String[] getMappings() { return new String[] { "querycache/Item.hbm.xml" }; } |
From: <hib...@li...> - 2006-03-09 21:11:47
|
Author: ste...@jb... Date: 2006-03-09 16:11:44 -0500 (Thu, 09 Mar 2006) New Revision: 9586 Modified: trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java Log: more super-duper-classic-parser-regression-testing-mojo-magic fun Modified: trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java 2006-03-09 21:11:30 UTC (rev 9585) +++ trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java 2006-03-09 21:11:44 UTC (rev 9586) @@ -194,6 +194,11 @@ } } + // super-duper-classic-parser-regression-testing-mojo-magic... + if ( explicitSubqueryFromElement && DotNode.useThetaStyleImplicitJoins ) { + implied = true; + } + Type elementType = queryableCollection.getElementType(); if ( elementType.isEntityType() ) { // A collection of entities... elem = createEntityAssociation( role, roleAlias, joinType ); |
From: <hib...@li...> - 2006-03-09 21:11:33
|
Author: ste...@jb... Date: 2006-03-09 16:11:30 -0500 (Thu, 09 Mar 2006) New Revision: 9585 Modified: trunk/Hibernate3/test/org/hibernate/test/hql/HQLTest.java Log: more super-duper-classic-parser-regression-testing-mojo-magic fun Modified: trunk/Hibernate3/test/org/hibernate/test/hql/HQLTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/hql/HQLTest.java 2006-03-09 21:11:01 UTC (rev 9584) +++ trunk/Hibernate3/test/org/hibernate/test/hql/HQLTest.java 2006-03-09 21:11:30 UTC (rev 9585) @@ -895,7 +895,9 @@ } public void testManyToManyJoinInSubselect() throws Exception { + DotNode.useThetaStyleImplicitJoins = true; assertTranslation( "select foo from Foo foo where foo in (select elt from Baz baz join baz.fooArray elt)" ); + DotNode.useThetaStyleImplicitJoins = false; } public void testImplicitJoinInSubselect() throws Exception { |
From: <hib...@li...> - 2006-03-09 21:11:05
|
Author: ste...@jb... Date: 2006-03-09 16:11:01 -0500 (Thu, 09 Mar 2006) New Revision: 9584 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/HQLTest.java Log: more super-duper-classic-parser-regression-testing-mojo-magic fun Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java 2006-03-09 18:48:31 UTC (rev 9583) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/hql/ast/tree/FromElementFactory.java 2006-03-09 21:11:01 UTC (rev 9584) @@ -194,6 +194,11 @@ } } + // super-duper-classic-parser-regression-testing-mojo-magic... + if ( explicitSubqueryFromElement && DotNode.useThetaStyleImplicitJoins ) { + implied = true; + } + Type elementType = queryableCollection.getElementType(); if ( elementType.isEntityType() ) { // A collection of entities... elem = createEntityAssociation( role, roleAlias, joinType ); Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/HQLTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/HQLTest.java 2006-03-09 18:48:31 UTC (rev 9583) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/hql/HQLTest.java 2006-03-09 21:11:01 UTC (rev 9584) @@ -895,7 +895,9 @@ } public void testManyToManyJoinInSubselect() throws Exception { + DotNode.useThetaStyleImplicitJoins = true; assertTranslation( "select foo from Foo foo where foo in (select elt from Baz baz join baz.fooArray elt)" ); + DotNode.useThetaStyleImplicitJoins = false; } public void testImplicitJoinInSubselect() throws Exception { |
From: <hib...@li...> - 2006-03-09 18:49:59
|
Author: epbernard Date: 2006-03-09 13:48:31 -0500 (Thu, 09 Mar 2006) New Revision: 9583 Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManagerFactory.java trunk/HibernateExt/ejb-api/src/javax/persistence/Query.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java Log: EJB-141 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java 2006-03-09 17:40:57 UTC (rev 9582) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java 2006-03-09 18:48:31 UTC (rev 9583) @@ -12,6 +12,8 @@ /** * @author Gavin King + * @author Emmanuel Bernard + * @deprecated no longer used since getEntityManager is no longer here */ public class CurrentEntityManagerImpl extends AbstractEntityManagerImpl { Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2006-03-09 17:40:57 UTC (rev 9582) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2006-03-09 18:48:31 UTC (rev 9583) @@ -1,6 +1,7 @@ //$Id$ package org.hibernate.ejb; +import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.PersistenceContextType; import javax.persistence.spi.PersistenceUnitTransactionType; @@ -9,6 +10,7 @@ /** * @author Gavin King + * @author Emmanuel Bernard */ public class EntityManagerFactoryImpl implements HibernateEntityManagerFactory { @@ -19,24 +21,24 @@ public EntityManagerFactoryImpl( SessionFactory sessionFactory, PersistenceUnitTransactionType transactionType, - boolean discardOnClose) { + boolean discardOnClose + ) { this.sessionFactory = sessionFactory; this.transactionType = transactionType; this.discardOnClose = discardOnClose; } public EntityManager createEntityManager() { - return createEntityManager( PersistenceContextType.TRANSACTION ); + return createEntityManager( null ); } - public EntityManager createEntityManager(PersistenceContextType type) { - return new EntityManagerImpl( sessionFactory, type, transactionType, discardOnClose ); + public EntityManager createEntityManager(Map map) { + //TODO support discardOnClose, persistencecontexttype?, interceptor, + return new EntityManagerImpl( + sessionFactory, PersistenceContextType.EXTENDED, transactionType, discardOnClose + ); } - public EntityManager getEntityManager() { - return new CurrentEntityManagerImpl( sessionFactory, transactionType ); - } - public void close() { sessionFactory.close(); } Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java 2006-03-09 17:40:57 UTC (rev 9582) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java 2006-03-09 18:48:31 UTC (rev 9583) @@ -226,15 +226,16 @@ /** * Close an application-managed EntityManager. - * After an EntityManager has been closed, all methods on the - * EntityManager instance will throw the IllegalStateException - * except for isOpen, which will return false. - * This method can only be called when the EntityManager - * is not associated with an active transaction. + * After the close method has been invoked, all methods + * on the EntityManager instance and any Query objects obtained + * from it will throw the IllegalStateException except + * for getTransaction and isOpen (which will return false). + * If this method is called when the EntityManager is + * associated with an active transaction, the persistence + * context remains managed until the transaction completes. * - * @throws IllegalStateException if the EntityManager is - * associated with an active transaction or if the - * EntityManager is container-managed. + * @throws IllegalStateException if the EntityManager + * is container-managed. */ public void close(); @@ -252,7 +253,7 @@ * * @return EntityTransaction instance * @throws IllegalStateException if invoked on a JTA - * EntityManager or an EntityManager that has been closed. + * EntityManager. */ public EntityTransaction getTransaction(); } \ No newline at end of file Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManagerFactory.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManagerFactory.java 2006-03-09 17:40:57 UTC (rev 9582) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManagerFactory.java 2006-03-09 18:48:31 UTC (rev 9583) @@ -1,47 +1,34 @@ //$Id$ package javax.persistence; +import java.util.Map; + public interface EntityManagerFactory { + /** - * Create a new EntityManager of of type - * PersistenceContextType.TRANSACTION. - * This method returns a new application-managed EntityManager - * instance (with a new stand-alone persistence context) each - * time it is invoked. + * Create a new EntityManager. + * This method returns a new EntityManager instance each time + * it is invoked. * The isOpen method will return true on the returned instance. */ EntityManager createEntityManager(); /** - * Create a new EntityManager of the specified persistence - * context type. - * This method returns a new application-managed EntityManager - * instance (with a new stand-alone persistence context) each - * time it is invoked. + * Create a new EntityManager with the specified Map of + * properties. + * This method returns a new EntityManager instance each time + * it is invoked. * The isOpen method will return true on the returned instance. */ - EntityManager createEntityManager(PersistenceContextType type); + EntityManager createEntityManager(Map map); /** - * Get an EntityManager instance whose persistence context - * is propagated with the current JTA transaction. - * If there is no persistence context bound to the current - * JTA transaction, a new transaction-scoped persistence - * context is created and associated with the transaction - * and the entity manager instance that is created and - * returned. If no JTA transaction is in progress, an - * EntityManager instance is created for which the persistence - * context will be propagated with subsequent JTA transactions. - * Throws IllegalStateException if called on an - * EntityManagerFactory that does not provide JTA EntityManagers. - */ - EntityManager getEntityManager(); - - /** * Close the factory, releasing any resources that it holds. * After a factory instance is closed, all methods invoked on * it will throw an IllegalStateException, except for isOpen, - * which will return false. + * which will return false. Once an EntityManagerFactory has + * been closed, all its entity managers are considered to be + * in the closed state. */ void close(); Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/Query.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/Query.java 2006-03-09 17:40:57 UTC (rev 9582) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/Query.java 2006-03-09 18:48:31 UTC (rev 9583) @@ -12,30 +12,30 @@ public interface Query { /** * Execute the query and return the query results as a List. - * + * * @return a list of the results */ public List getResultList(); /** * Execute a query that returns a single result. - * + * * @return the result - * @throws EntityNotFoundException if there is no result + * @throws EntityNotFoundException if there is no result * @throws NonUniqueResultException if more than one result */ public Object getSingleResult(); /** * Execute an update or delete statement. - * + * * @return the number of entities updated or deleted */ public int executeUpdate(); /** * Set the maximum number of results to retrieve. - * + * * @param maxResult * @return the same query instance * @throws IllegalArgumentException if argument is negative @@ -44,7 +44,7 @@ /** * Set the position of the first result to retrieve. - * + * * @param startPosition position of the first result, numbered from 0 * @return the same query instance * @throws IllegalArgumentException if argument is negative @@ -54,7 +54,7 @@ /** * Set an implementation-specific hint. If the hint name is not recognized, it is silently * ignored. - * + * * @param hintName * @param value * @return the same query instance @@ -64,65 +64,65 @@ /** * Bind an argument to a named parameter. - * - * @param name the parameter name + * + * @param name the parameter name * @param value * @return the same query instance * @throws IllegalArgumentException if parameter name does not* correspond to parameter in query - * string or argument is of incorrect type + * string or argument is of incorrect type */ public Query setParameter(String name, Object value); /** * Bind an instance of java.util.Date to a named parameter. - * + * * @param name * @param value * @param temporalType * @return the same query instance * @throws IllegalArgumentException if parameter name does not correspond to parameter in query - * string + * string */ public Query setParameter(String name, Date value, TemporalType temporalType); /** * Bind an instance of java.util.Calendar to a named parameter. - * + * * @param name * @param value * @param temporalType * @return the same query instance * @throws IllegalArgumentException if parameter name does not correspond to parameter in query - * string + * string */ public Query setParameter(String name, Calendar value, TemporalType temporalType); /** * Bind an argument to a positional parameter. - * + * * @param position * @param value * @return the same query instance * @throws IllegalArgumentException if position does not correspond to positional parameter of - * query or argument is of incorrect type + * query or argument is of incorrect type */ public Query setParameter(int position, Object value); /** * Bind an instance of java.util.Date to a positional parameter. - * + * * @param position * @param value * @param temporalType * @return the same query instance * @throws IllegalArgumentException if position does not correspond to positional parameter of - * query + * query */ public Query setParameter(int position, Date value, TemporalType temporalType); /** * Bind an instance of java.util.Calendar to a positional parameter. - * + * * @param position * @param value * @param temporalType @@ -132,7 +132,9 @@ /** * Set the flush mode type to be used for the query execution. - * + * The flush mode type applies to the query regardless of the + * flush mode type in use for the entity manager. + * * @param flushMode */ public Query setFlushMode(FlushModeType flushMode); |