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: max...@jb... Date: 2006-03-16 09:14:48 -0500 (Thu, 16 Mar 2006) New Revision: 9636 Modified: trunk/Hibernate3/src/org/hibernate/Query.java trunk/Hibernate3/src/org/hibernate/cache/QueryKey.java trunk/Hibernate3/src/org/hibernate/engine/QueryParameters.java trunk/Hibernate3/src/org/hibernate/hql/HolderInstantiator.java trunk/Hibernate3/src/org/hibernate/hql/classic/QueryTranslatorImpl.java trunk/Hibernate3/src/org/hibernate/impl/AbstractQueryImpl.java trunk/Hibernate3/src/org/hibernate/loader/Loader.java trunk/Hibernate3/src/org/hibernate/loader/criteria/CriteriaLoader.java trunk/Hibernate3/src/org/hibernate/loader/criteria/CriteriaQueryTranslator.java trunk/Hibernate3/src/org/hibernate/loader/custom/CustomLoader.java trunk/Hibernate3/src/org/hibernate/loader/custom/CustomQuery.java trunk/Hibernate3/src/org/hibernate/loader/custom/SQLCustomQuery.java trunk/Hibernate3/src/org/hibernate/loader/entity/AbstractEntityLoader.java trunk/Hibernate3/src/org/hibernate/loader/entity/CollectionElementLoader.java trunk/Hibernate3/src/org/hibernate/loader/hql/QueryLoader.java trunk/Hibernate3/test/org/hibernate/test/dom4j/Dom4jTest.java trunk/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java trunk/Hibernate3/test/org/hibernate/test/legacy/FumTest.java trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java trunk/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java Log: HHH-38 Add setResultClass or similar to Criteria and HQL HHH-332 Add ResultTransformer support for HQL HHH-587 Add ResultTransformer for all query methods (HQL, Criteria & SQL) Modified: trunk/Hibernate3/src/org/hibernate/Query.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/Query.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/Query.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -11,6 +11,7 @@ import java.util.List; import java.util.Locale; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.Type; /** @@ -352,6 +353,16 @@ * @param val a non-null instance of a persistent class */ public Query setEntity(String name, Object val); // use setParameter for null values + + + /** + * Set a strategy for handling the query results. This can be used to change + * "shape" of the query result. + * + * @param resultTransformer The transformer to apply + * @return this (for method chaining) + */ + public Query setResultTransformer(ResultTransformer transformer); } Modified: trunk/Hibernate3/src/org/hibernate/cache/QueryKey.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cache/QueryKey.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/cache/QueryKey.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -8,6 +8,7 @@ import org.hibernate.EntityMode; import org.hibernate.engine.QueryParameters; import org.hibernate.engine.RowSelection; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.Type; import org.hibernate.util.EqualsHelper; @@ -26,6 +27,9 @@ private final Set filters; private final int hashCode; + // the user provided resulttransformer, not the one used with "select new". Here to avoid mangling transformed/non-transformed results. + private final ResultTransformer customTransformer; + public QueryKey(String queryString, QueryParameters queryParameters, Set filters, EntityMode entityMode) { this.sqlQueryString = queryString; this.types = queryParameters.getPositionalParameterTypes(); @@ -42,6 +46,7 @@ this.namedParameters = queryParameters.getNamedParameters(); this.entityMode = entityMode; this.filters = filters; + this.customTransformer = queryParameters.getResultTransformer(); this.hashCode = getHashCode(); } @@ -49,6 +54,7 @@ QueryKey that = (QueryKey) other; if ( !sqlQueryString.equals(that.sqlQueryString) ) return false; if ( !EqualsHelper.equals(firstRow, that.firstRow) || !EqualsHelper.equals(maxRows, that.maxRows) ) return false; + if ( !EqualsHelper.equals(customTransformer, that.customTransformer) ) return false; if (types==null) { if (that.types!=null) return false; } @@ -78,6 +84,7 @@ } result = 37 * result + ( namedParameters==null ? 0 : namedParameters.hashCode() ); result = 37 * result + ( filters==null ? 0 : filters.hashCode() ); + result = 37 * result + ( customTransformer==null ? 0 : customTransformer.hashCode() ); result = 37 * result + sqlQueryString.hashCode(); return result; } @@ -103,6 +110,7 @@ } if (firstRow!=null) buf.append("; first row: ").append(firstRow); if (maxRows!=null) buf.append("; max rows: ").append(maxRows); + if (customTransformer!=null) buf.append("; transformer: ").append(customTransformer); return buf.toString(); } Modified: trunk/Hibernate3/src/org/hibernate/engine/QueryParameters.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/QueryParameters.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/engine/QueryParameters.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -19,6 +19,7 @@ import org.hibernate.dialect.Dialect; import org.hibernate.hql.classic.ParserHelper; import org.hibernate.pretty.Printer; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.Type; import org.hibernate.util.ArrayHelper; @@ -46,6 +47,8 @@ private boolean autodiscovertypes = false; private boolean isNaturalKeyLookup; + private final ResultTransformer resultTransformer; // why is all others non final ? + private String processedSQL; private Type[] processedPositionalParameterTypes; private Object[] processedPositionalParameterValues; @@ -84,7 +87,8 @@ false, null, null, - false + false, + null ); } @@ -117,7 +121,8 @@ false, null, null, - collectionKeys + collectionKeys, + null ); } @@ -130,7 +135,8 @@ final String cacheRegion, //final boolean forceCacheRefresh, final String comment, - final boolean isLookupByNaturalKey + final boolean isLookupByNaturalKey, + final ResultTransformer transformer ) { this( positionalParameterTypes, @@ -142,7 +148,8 @@ cacheable, cacheRegion, comment, - null + null, + transformer ); isNaturalKeyLookup = isLookupByNaturalKey; } @@ -158,7 +165,8 @@ final String cacheRegion, //final boolean forceCacheRefresh, final String comment, - final Serializable[] collectionKeys + final Serializable[] collectionKeys, + ResultTransformer transformer ) { this.positionalParameterTypes = positionalParameterTypes; this.positionalParameterValues = positionalParameterValues; @@ -171,6 +179,7 @@ this.comment = comment; this.collectionKeys = collectionKeys; this.readOnly = readOnly; + this.resultTransformer = transformer; } public QueryParameters( @@ -187,7 +196,8 @@ final Serializable[] collectionKeys, final Object optionalObject, final String optionalEntityName, - final Serializable optionalId + final Serializable optionalId, + final ResultTransformer transformer ) { this( positionalParameterTypes, @@ -199,7 +209,8 @@ cacheable, cacheRegion, comment, - collectionKeys + collectionKeys, + transformer ); this.optionalEntityName = optionalEntityName; this.optionalId = optionalId; @@ -225,6 +236,10 @@ public RowSelection getRowSelection() { return rowSelection; } + + public ResultTransformer getResultTransformer() { + return resultTransformer; + } public void setNamedParameters(Map map) { namedParameters = map; @@ -454,11 +469,14 @@ this.collectionKeys, this.optionalObject, this.optionalEntityName, - this.optionalId + this.optionalId, + this.resultTransformer ); copy.processedSQL = this.processedSQL; copy.processedPositionalParameterTypes = this.processedPositionalParameterTypes; copy.processedPositionalParameterValues = this.processedPositionalParameterValues; return copy; } + + } Modified: trunk/Hibernate3/src/org/hibernate/hql/HolderInstantiator.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/hql/HolderInstantiator.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/hql/HolderInstantiator.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -2,65 +2,80 @@ package org.hibernate.hql; import java.lang.reflect.Constructor; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import org.hibernate.QueryException; +import org.hibernate.transform.AliasToBeanConstructorResultTransformer; +import org.hibernate.transform.ResultTransformer; +import org.hibernate.transform.Transformers; /** * @author Gavin King */ public final class HolderInstantiator { + + public static final HolderInstantiator NOOP_INSTANTIATOR = new HolderInstantiator(null,null); - //TODO: have an interface and three different subclasses! - - private final Constructor constructor; - private final boolean returnMaps; - private final boolean returnLists; + private final ResultTransformer transformer; private final String[] queryReturnAliases; + public static HolderInstantiator getHolderInstantiator(ResultTransformer selectNewTransformer, ResultTransformer customTransformer, String[] queryReturnAliases) { + if(selectNewTransformer!=null) { + return new HolderInstantiator(selectNewTransformer, queryReturnAliases); + } else { + return new HolderInstantiator(customTransformer, queryReturnAliases); + } + } + + public static ResultTransformer createSelectNewTransformer(Constructor constructor, boolean returnMaps, boolean returnLists) { + if ( constructor != null ) { + return new AliasToBeanConstructorResultTransformer(constructor); + } + else if ( returnMaps ) { + return Transformers.ALIAS_TO_ENTITY_MAP; + } + else if ( returnLists ) { + return Transformers.TO_LIST; + } + else { + return null; + } + } + + static public HolderInstantiator createClassicHolderInstantiator(Constructor constructor, + ResultTransformer transformer) { + if ( constructor != null ) { + return new HolderInstantiator(new AliasToBeanConstructorResultTransformer(constructor), null); + } + else { + return new HolderInstantiator(transformer, null); + } + } + public HolderInstantiator( - Constructor constructor, - boolean returnMaps, - boolean returnLists, + ResultTransformer transformer, String[] queryReturnAliases ) { - this.constructor = constructor; - this.returnLists = returnLists; - this.returnMaps = returnMaps; + this.transformer = transformer; this.queryReturnAliases = queryReturnAliases; } public boolean isRequired() { - return constructor!=null || returnLists || returnMaps; + return transformer!=null; } public Object instantiate(Object[] row) { - if ( constructor != null ) { - try { - return constructor.newInstance( row ); - } - catch ( Exception e ) { - throw new QueryException( - "could not instantiate: " + - constructor.getDeclaringClass().getName(), - e ); - } - } - else if ( returnMaps ) { - Map map = new HashMap(); - for ( int j = 0; j < row.length; j++ ) { - map.put( queryReturnAliases[j], row[j] ); - } - return map; - } - else if ( returnLists ) { - return Arrays.asList(row); - } - else { + if(transformer==null) { return row; + } else { + return transformer.transformTuple(row, queryReturnAliases); } + } + + public String[] getQueryReturnAliases() { + return queryReturnAliases; } - + + public ResultTransformer getResultTransformer() { + return transformer; + } + } Modified: trunk/Hibernate3/src/org/hibernate/hql/classic/QueryTranslatorImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/hql/classic/QueryTranslatorImpl.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/hql/classic/QueryTranslatorImpl.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -43,6 +43,7 @@ import org.hibernate.sql.ForUpdateFragment; import org.hibernate.sql.JoinFragment; import org.hibernate.sql.QuerySelect; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.AssociationType; import org.hibernate.type.EntityType; import org.hibernate.type.Type; @@ -901,7 +902,7 @@ PreparedStatement st = prepareQueryStatement( queryParameters, false, session ); ResultSet rs = getResultSet( st, queryParameters.hasAutoDiscoverScalarTypes(), false, queryParameters.getRowSelection(), session ); - HolderInstantiator hi = new HolderInstantiator(holderConstructor, false, false, null); + HolderInstantiator hi = HolderInstantiator.createClassicHolderInstantiator(holderConstructor, queryParameters.getResultTransformer()); Iterator result = new IteratorImpl( rs, st, session, returnTypes, getColumnNames(), hi ); if ( stats ) { @@ -930,7 +931,7 @@ throw new UnsupportedOperationException( "Not supported! Use the AST translator..."); } - protected Object getResultColumnOrRow(Object[] row, ResultSet rs, SessionImplementor session) + protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session) throws SQLException, HibernateException { row = toResultRow( row ); if ( hasScalars ) { @@ -955,7 +956,7 @@ } - protected List getResultList(List results) throws QueryException { + protected List getResultList(List results, ResultTransformer resultTransformer) throws QueryException { if ( holderClass != null ) { for ( int i = 0; i < results.size(); i++ ) { Object[] row = ( Object[] ) results.get( i ); @@ -1071,7 +1072,7 @@ public ScrollableResults scroll(final QueryParameters queryParameters, final SessionImplementor session) throws HibernateException { - HolderInstantiator hi = new HolderInstantiator(holderConstructor, false, false, null); + HolderInstantiator hi = HolderInstantiator.createClassicHolderInstantiator(holderConstructor, queryParameters.getResultTransformer()); return scroll( queryParameters, returnTypes, hi, session ); } Modified: trunk/Hibernate3/src/org/hibernate/impl/AbstractQueryImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/impl/AbstractQueryImpl.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/impl/AbstractQueryImpl.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -34,6 +34,7 @@ import org.hibernate.hql.classic.ParserHelper; import org.hibernate.property.Getter; import org.hibernate.proxy.HibernateProxyHelper; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.SerializableType; import org.hibernate.type.Type; import org.hibernate.type.TypeFactory; @@ -76,6 +77,7 @@ private CacheMode sessionCacheMode; private Serializable collectionKey; private boolean readOnly; + private ResultTransformer resultTransformer; public AbstractQueryImpl( String queryString, @@ -170,6 +172,11 @@ return this; } + public Query setResultTransformer(ResultTransformer transformer) { + this.resultTransformer = transformer; + return this; + } + public void setOptionalEntityName(String optionalEntityName) { this.optionalEntityName = optionalEntityName; } @@ -791,7 +798,8 @@ collectionKey == null ? null : new Serializable[] { collectionKey }, optionalObject, optionalEntityName, - optionalId + optionalId, + resultTransformer ); } Modified: trunk/Hibernate3/src/org/hibernate/loader/Loader.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/Loader.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/loader/Loader.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -5,7 +5,6 @@ import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; @@ -46,8 +45,8 @@ import org.hibernate.event.PreLoadEvent; import org.hibernate.exception.JDBCExceptionHelper; import org.hibernate.hql.HolderInstantiator; +import org.hibernate.impl.FetchingScrollableResultsImpl; import org.hibernate.impl.ScrollableResultsImpl; -import org.hibernate.impl.FetchingScrollableResultsImpl; import org.hibernate.jdbc.ColumnNameCache; import org.hibernate.jdbc.ResultSetWrapper; import org.hibernate.persister.collection.CollectionPersister; @@ -56,6 +55,7 @@ import org.hibernate.persister.entity.UniqueKeyLoadable; import org.hibernate.pretty.MessageHelper; import org.hibernate.proxy.HibernateProxy; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.AssociationType; import org.hibernate.type.EntityType; import org.hibernate.type.Type; @@ -592,7 +592,7 @@ } } - return getResultColumnOrRow( row, resultSet, session ); + return getResultColumnOrRow( row, queryParameters.getResultTransformer(), resultSet, session ); } @@ -867,7 +867,7 @@ .endLoadingCollections( collectionPersister, resultSetId, session ); } - protected List getResultList(List results) throws QueryException { + protected List getResultList(List results, ResultTransformer resultTransformer) throws QueryException { return results; } @@ -876,7 +876,7 @@ * This empty implementation merely returns its first argument. This is * overridden by some subclasses. */ - protected Object getResultColumnOrRow(Object[] row, ResultSet rs, SessionImplementor session) + protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session) throws SQLException, HibernateException { return row; } @@ -2026,7 +2026,7 @@ } private List listIgnoreQueryCache(SessionImplementor session, QueryParameters queryParameters) { - return getResultList( doList( session, queryParameters ) ); + return getResultList( doList( session, queryParameters ), queryParameters.getResultTransformer() ); } private List listUsingQueryCache( @@ -2070,7 +2070,7 @@ ); } - return getResultList( result ); + return getResultList( result, queryParameters.getResultTransformer() ); } private List getResultFromQueryCache( Modified: trunk/Hibernate3/src/org/hibernate/loader/criteria/CriteriaLoader.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/criteria/CriteriaLoader.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/loader/criteria/CriteriaLoader.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -22,6 +22,7 @@ import org.hibernate.persister.entity.Loadable; import org.hibernate.persister.entity.OuterJoinLoadable; import org.hibernate.sql.ForUpdateFragment; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.Type; /** @@ -95,7 +96,7 @@ } - protected Object getResultColumnOrRow(Object[] row, ResultSet rs, SessionImplementor session) + protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session) throws SQLException, HibernateException { final Object[] result; final String[] aliases; @@ -160,7 +161,7 @@ return hasSubselectLoadableCollections(); } - protected List getResultList(List results) { + protected List getResultList(List results, ResultTransformer resultTransformer) { return translator.getRootCriteria().getResultTransformer() .transformList(results); } Modified: trunk/Hibernate3/src/org/hibernate/loader/criteria/CriteriaQueryTranslator.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/criteria/CriteriaQueryTranslator.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/loader/criteria/CriteriaQueryTranslator.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -287,7 +287,8 @@ rootCriteria.getCacheable(), rootCriteria.getCacheRegion(), rootCriteria.getComment(), - rootCriteria.isLookupByNaturalKey() + rootCriteria.isLookupByNaturalKey(), + rootCriteria.getResultTransformer() ); } Modified: trunk/Hibernate3/src/org/hibernate/loader/custom/CustomLoader.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/custom/CustomLoader.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/loader/custom/CustomLoader.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -15,11 +15,13 @@ import org.hibernate.engine.QueryParameters; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.engine.SessionImplementor; +import org.hibernate.hql.HolderInstantiator; import org.hibernate.loader.CollectionAliases; import org.hibernate.loader.EntityAliases; import org.hibernate.loader.Loader; import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.entity.Loadable; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.Type; import org.hibernate.type.TypeFactory; import org.hibernate.util.ArrayHelper; @@ -32,6 +34,8 @@ */ public class CustomLoader extends Loader { + // Currently *not* cachable if autodiscover types is in effect (e.g. "select * ...") + private final Type[] resultTypes; private final Loadable[] persisters; private final CollectionPersister[] collectionPersisters; @@ -39,12 +43,15 @@ private Type[] discoveredTypes; private String[] discoveredColumnAliases; private ResultSetMetaData metaData; - + private final String[] queryReturnAliases; + public CustomLoader( CustomQuery customQuery, SessionFactoryImplementor factory) { super(factory); this.customQuery = customQuery; + + queryReturnAliases = customQuery.getReturnAliases(); String[] collectionRoles = customQuery.getCollectionRoles(); if ( collectionRoles==null ) { @@ -107,16 +114,24 @@ public List list( SessionImplementor session, - QueryParameters queryParameters) throws HibernateException { + QueryParameters queryParameters) throws HibernateException { return list(session, queryParameters, customQuery.getQuerySpaces(), resultTypes); } public ScrollableResults scroll( final QueryParameters queryParameters, - final SessionImplementor session) throws HibernateException { - return scroll(queryParameters, resultTypes, null, session); + final SessionImplementor session) throws HibernateException { + return scroll(queryParameters, resultTypes, getHolderInstantiator(queryParameters.getResultTransformer(), getReturnAliasesForTransformer()), session); } + static private HolderInstantiator getHolderInstantiator(ResultTransformer resultTransformer, String[] queryReturnAliases) { + if(resultTransformer!=null) { + return HolderInstantiator.NOOP_INSTANTIATOR; + } else { + return new HolderInstantiator(resultTransformer, queryReturnAliases); + } + } + protected void autoDiscoverTypes(ResultSet rs) { try { metaData = rs.getMetaData(); @@ -170,8 +185,8 @@ protected Object getResultColumnOrRow( Object[] row, - ResultSet rs, - SessionImplementor session) throws SQLException, HibernateException { + ResultTransformer transformer, + ResultSet rs, SessionImplementor session) throws SQLException, HibernateException { Type[] scalarTypes = discoveredTypes==null ? customQuery.getScalarTypes() : discoveredTypes; String[] scalarColumnAliases = discoveredColumnAliases==null ? customQuery.getScalarColumnAliases() : discoveredColumnAliases; @@ -189,21 +204,36 @@ resultRow = row; } + if(transformer!=null) { + return resultRow; + } return resultRow.length == 1 ? resultRow[0] : resultRow; } -// protected Object getResultColumnOrRow( -// Object[] row, -// ResultSet rs, -// SessionImplementor session) throws SQLException, HibernateException { -// if ( persisters.length == 1 ) { -// return row[row.length - 1]; -// } -// else { -// return row; -// } -// } + protected List getResultList(List results, ResultTransformer resultTransformer) throws QueryException { + // meant to handle dynamic instantiation queries...(Copy from QueryLoader) + HolderInstantiator holderInstantiator = HolderInstantiator.getHolderInstantiator(null, resultTransformer, getReturnAliasesForTransformer()); + if ( holderInstantiator.isRequired() ) { + for ( int i = 0; i < results.size(); i++ ) { + Object[] row = ( Object[] ) results.get( i ); + Object result = holderInstantiator.instantiate(row); + results.set( i, result ); + } + + return resultTransformer.transformList(results); + } else { + return results; + } + } + private String[] getReturnAliasesForTransformer() { + if(discoveredColumnAliases!=null) { + return discoveredColumnAliases; + } else { + return queryReturnAliases; + } + } + protected EntityAliases[] getEntityAliases() { return customQuery.getEntityAliases(); } Modified: trunk/Hibernate3/src/org/hibernate/loader/custom/CustomQuery.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/custom/CustomQuery.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/loader/custom/CustomQuery.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -54,5 +54,9 @@ * Optional, may return null */ public String[] getScalarColumnAliases(); + /** + * Optional, may return null + */ + public String[] getReturnAliases(); } Modified: trunk/Hibernate3/src/org/hibernate/loader/custom/SQLCustomQuery.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/custom/SQLCustomQuery.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/loader/custom/SQLCustomQuery.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -44,7 +44,8 @@ private final String[] scalarColumnAliases; private final EntityAliases[] entityDescriptors; private final CollectionAliases[] collectionDescriptors; - + private final String[] returnAliases; + public String getSQL() { return sql; } @@ -130,7 +131,7 @@ collectionOwners = null; } - String[] aliases = ArrayHelper.toStringArray( processor.getAliases() ); + String[] aliases = ArrayHelper.toStringArray( processor.getAliases() ); String[] collAliases = ArrayHelper.toStringArray( processor.getCollectionAliases() ); String[] collSuffixes = ArrayHelper.toStringArray(collectionSuffixes); @@ -141,6 +142,9 @@ scalarColumnAliases = ArrayHelper.toStringArray( processor.getScalarColumnAliases() ); scalarTypes = ArrayHelper.toTypeArray( processor.getScalarTypes() ); + // need to match the "sequence" of what we return. scalar first, entity last. + returnAliases = ArrayHelper.join(scalarColumnAliases, aliases); + String[] suffixes = BasicLoader.generateSuffixes(entityPersisters.length); SQLQueryParser parser = new SQLQueryParser( @@ -221,5 +225,9 @@ this.entityOwners = ownersArray; } + + public String[] getReturnAliases() { + return returnAliases; + } } Modified: trunk/Hibernate3/src/org/hibernate/loader/entity/AbstractEntityLoader.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/entity/AbstractEntityLoader.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/loader/entity/AbstractEntityLoader.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -14,6 +14,7 @@ import org.hibernate.engine.SessionImplementor; import org.hibernate.loader.OuterJoinLoader; import org.hibernate.persister.entity.OuterJoinLoadable; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.Type; public abstract class AbstractEntityLoader extends OuterJoinLoader @@ -76,7 +77,7 @@ } - protected Object getResultColumnOrRow(Object[] row, ResultSet rs, SessionImplementor session) + protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session) throws SQLException, HibernateException { return row[row.length-1]; } Modified: trunk/Hibernate3/src/org/hibernate/loader/entity/CollectionElementLoader.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/entity/CollectionElementLoader.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/loader/entity/CollectionElementLoader.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -17,6 +17,7 @@ import org.hibernate.loader.OuterJoinLoader; import org.hibernate.persister.collection.QueryableCollection; import org.hibernate.persister.entity.OuterJoinLoadable; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.Type; import org.hibernate.util.ArrayHelper; @@ -96,8 +97,8 @@ protected Object getResultColumnOrRow( Object[] row, - ResultSet rs, - SessionImplementor session) + ResultTransformer transformer, + ResultSet rs, SessionImplementor session) throws SQLException, HibernateException { return row[row.length-1]; } Modified: trunk/Hibernate3/src/org/hibernate/loader/hql/QueryLoader.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/hql/QueryLoader.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/src/org/hibernate/loader/hql/QueryLoader.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -31,6 +31,7 @@ import org.hibernate.persister.entity.Loadable; import org.hibernate.persister.entity.Queryable; import org.hibernate.sql.ForUpdateFragment; +import org.hibernate.transform.ResultTransformer; import org.hibernate.type.EntityType; import org.hibernate.type.Type; import org.hibernate.util.ArrayHelper; @@ -74,11 +75,15 @@ private QueryableCollection[] collectionPersisters; private int selectLength; - private HolderInstantiator holderInstantiator; + + private ResultTransformer selectNewTransformer; + private String[] queryReturnAliases; private LockMode[] defaultLockModes; + + /** * Creates a new Loader implementation. * @@ -104,12 +109,11 @@ //sqlResultTypes = selectClause.getSqlResultTypes(); queryReturnTypes = selectClause.getQueryReturnTypes(); - holderInstantiator = new HolderInstantiator( - selectClause.getConstructor(), - selectClause.isMap(), - selectClause.isList(), - selectClause.getQueryReturnAliases() - ); + selectNewTransformer = HolderInstantiator.createSelectNewTransformer( + selectClause.getConstructor(), + selectClause.isMap(), + selectClause.isList()); + queryReturnAliases = selectClause.getQueryReturnAliases(); List collectionFromElements = selectClause.getCollectionFromElements(); if ( collectionFromElements != null && collectionFromElements.size()!=0 ) { @@ -320,15 +324,19 @@ return true; } - protected Object getResultColumnOrRow(Object[] row, ResultSet rs, SessionImplementor session) + private boolean hasSelectNew() { + return selectNewTransformer!=null; + } + + protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session) throws SQLException, HibernateException { row = toResultRow( row ); - boolean isHolder = holderInstantiator.isRequired(); + boolean hasTransform = hasSelectNew() || transformer!=null; if ( hasScalars ) { String[][] scalarColumns = scalarColumnNames; int queryCols = queryReturnTypes.length; - if ( !isHolder && queryCols == 1 ) { + if ( !hasTransform && queryCols == 1 ) { return queryReturnTypes[0].nullSafeGet( rs, scalarColumns[0], session, null ); } else { @@ -339,7 +347,7 @@ return row; } } - else if ( !isHolder ) { + else if ( !hasTransform ) { return row.length == 1 ? row[0] : row; } else { @@ -348,16 +356,24 @@ } - protected List getResultList(List results) throws QueryException { + protected List getResultList(List results, ResultTransformer resultTransformer) throws QueryException { // meant to handle dynamic instantiation queries... + HolderInstantiator holderInstantiator = HolderInstantiator.getHolderInstantiator(selectNewTransformer, resultTransformer, queryReturnAliases); if ( holderInstantiator.isRequired() ) { for ( int i = 0; i < results.size(); i++ ) { Object[] row = ( Object[] ) results.get( i ); Object result = holderInstantiator.instantiate(row); results.set( i, result ); } + + if(!hasSelectNew() && resultTransformer!=null) { + return resultTransformer.transformList(results); + } else { + return results; + } + } else { + return results; } - return results; } // --- Query translator methods --- @@ -371,16 +387,23 @@ * @throws HibernateException */ public List list(SessionImplementor session, QueryParameters queryParameters) - throws HibernateException { + throws HibernateException { + checkQuery( queryParameters ); return list( session, queryParameters, queryTranslator.getQuerySpaces(), queryReturnTypes ); } + private void checkQuery(QueryParameters queryParameters) { + if(hasSelectNew() && queryParameters.getResultTransformer()!=null) { + throw new QueryException("ResultTransformer is not allowed for 'select new' queries."); + } + } + /** * Return the query results as an iterator */ public Iterator iterate(QueryParameters queryParameters, EventSource session) throws HibernateException { - + checkQuery( queryParameters ); final boolean stats = session.getFactory().getStatistics().isStatisticsEnabled(); long startTime = 0; if ( stats ) { @@ -401,7 +424,7 @@ session, queryReturnTypes, queryTranslator.getColumnNames(), - holderInstantiator + HolderInstantiator.getHolderInstantiator(selectNewTransformer, queryParameters.getResultTransformer(), queryReturnAliases) ); if ( stats ) { @@ -430,7 +453,8 @@ public ScrollableResults scroll( final QueryParameters queryParameters, final SessionImplementor session) throws HibernateException { - return scroll( queryParameters, queryReturnTypes, holderInstantiator, session ); + checkQuery( queryParameters ); + return scroll( queryParameters, queryReturnTypes, HolderInstantiator.getHolderInstantiator(selectNewTransformer, queryParameters.getResultTransformer(), queryReturnAliases), session ); } // -- Implementation private methods -- Modified: trunk/Hibernate3/test/org/hibernate/test/dom4j/Dom4jTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/dom4j/Dom4jTest.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/test/org/hibernate/test/dom4j/Dom4jTest.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -1,6 +1,8 @@ // $Id$ package org.hibernate.test.dom4j; +import java.util.Map; + import junit.framework.Test; import junit.framework.TestSuite; @@ -16,6 +18,7 @@ import org.hibernate.cfg.Environment; import org.hibernate.criterion.Example; import org.hibernate.test.TestCase; +import org.hibernate.transform.Transformers; /** * @author Gavin King @@ -207,6 +210,17 @@ s = openSession(); t = s.beginTransaction(); + Map m = (Map) s.createQuery( "select a as acc from Account a left join fetch a.customer" ) + .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).uniqueResult(); + acct = (Element)m.get("acc"); + print( acct ); + t.commit(); + s.close(); + + System.out.println(); + + s = openSession(); + t = s.beginTransaction(); acct = (Element) s.createQuery( "from Account" ).uniqueResult(); print( acct ); t.commit(); Modified: trunk/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -11,29 +11,32 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.HashSet; import junit.framework.Test; import junit.framework.TestSuite; import org.hibernate.Hibernate; +import org.hibernate.HibernateException; import org.hibernate.Query; +import org.hibernate.QueryException; import org.hibernate.ScrollableResults; import org.hibernate.Session; import org.hibernate.Transaction; -import org.hibernate.QueryException; -import org.hibernate.stat.QueryStatistics; +import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; -import org.hibernate.cfg.Configuration; import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.HSQLDialect; import org.hibernate.dialect.MySQLDialect; import org.hibernate.dialect.Oracle9Dialect; +import org.hibernate.stat.QueryStatistics; import org.hibernate.test.TestCase; import org.hibernate.test.cid.Customer; import org.hibernate.test.cid.LineItem; import org.hibernate.test.cid.Order; import org.hibernate.test.cid.Product; +import org.hibernate.transform.AliasToBeanResultTransformer; +import org.hibernate.transform.DistinctRootEntityResultTransformer; +import org.hibernate.transform.Transformers; import org.hibernate.type.ManyToOneType; import org.hibernate.type.Type; import org.hibernate.util.StringHelper; @@ -1091,11 +1094,16 @@ List results = session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" ).list(); assertEquals( "Incorrect result size", 2, results.size() ); - assertTrue( "Incorrect return type", results.get( 0 ) instanceof Animal ); - + assertClassAssignability( results.get( 0 ).getClass(), Animal.class ); + Iterator iter = session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" ).iterate(); assertTrue( "Incorrect result size", iter.hasNext() ); - assertTrue( "Incorrect return type", iter.next() instanceof Animal ); + assertTrue( "Incorrect return type", iter.next() instanceof Animal ); + + results = session.createQuery( "select new list(an.description, an.bodyWeight) from Animal an" ).list(); + assertEquals( "Incorrect result size", 2, results.size() ); + assertTrue( "Incorrect return type", results.get( 0 ) instanceof List ); + assertEquals( "Incorrect return type", ( (List) results.get( 0 ) ).size(), 2 ); results = session.createQuery( "select new list(an.description, an.bodyWeight) from Animal an" ).list(); assertEquals( "Incorrect result size", 2, results.size() ); @@ -1108,6 +1116,12 @@ assertTrue( "Incorrect return type", obj instanceof List ); assertEquals( "Incorrect return type", ( (List) obj ).size(), 2 ); + iter = ((org.hibernate.classic.Session)session).iterate( "select new list(an.description, an.bodyWeight) from Animal an" ); + assertTrue( "Incorrect result size", iter.hasNext() ); + obj = iter.next(); + assertTrue( "Incorrect return type", obj instanceof List ); + assertEquals( "Incorrect return type", ( (List) obj ).size(), 2 ); + results = session.createQuery( "select new map(an.description, an.bodyWeight) from Animal an" ).list(); assertEquals( "Incorrect result size", 2, results.size() ); assertTrue( "Incorrect return type", results.get( 0 ) instanceof Map ); @@ -1139,7 +1153,7 @@ assertTrue( "Incorrect result size", sr.next() ); assertTrue( "Incorrect return type", sr.get(0) instanceof Animal ); sr.close(); - + // caching... QueryStatistics stats = getSessions().getStatistics().getQueryStatistics( "select new Animal(an.description, an.bodyWeight) from Animal an" ); results = session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" ) @@ -1160,6 +1174,141 @@ destroyTestBaseData(); } + public void testIllegalMixedTransformerQueries() { + Session session = openSession(); + + try { + getSelectNewQuery( session ).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list(); + fail("'select new' together with a resulttransformer should result in error!"); + } catch(QueryException he) { + assertTrue(he.getMessage().indexOf("ResultTransformer")==0); + } + + try { + getSelectNewQuery( session ).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).iterate(); + fail("'select new' together with a resulttransformer should result in error!"); + } catch(HibernateException he) { + assertTrue(he.getMessage().indexOf("ResultTransformer")==0); + } + + try { + getSelectNewQuery( session ).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).scroll(); + fail("'select new' together with a resulttransformer should result in error!"); + } catch(HibernateException he) { + assertTrue(he.getMessage().indexOf("ResultTransformer")==0); + } + + session.close(); + } + + private Query getSelectNewQuery(Session session) { + return session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" ); + } + public void testResultTransformerScalarQueries() throws Exception { + + createTestBaseData(); + + String query = "select an.description as description, an.bodyWeight as bodyWeight from Animal an order by bodyWeight desc"; + + Session session = openSession(); + + List results = session.createQuery( query ) + .setResultTransformer(Transformers.aliasToBean(Animal.class)).list(); + assertEquals( "Incorrect result size", results.size(), 2 ); + assertTrue( "Incorrect return type", results.get(0) instanceof Animal ); + Animal firstAnimal = (Animal) results.get(0); + Animal secondAnimal = (Animal) results.get(1); + assertEquals("Mammal #1", firstAnimal.getDescription()); + assertEquals("Mammal #2", secondAnimal.getDescription()); + assertFalse(session.contains(firstAnimal)); + session.close(); + + session = openSession(); + + Iterator iter = session.createQuery( query ) + .setResultTransformer(Transformers.aliasToBean(Animal.class)).iterate(); + assertTrue( "Incorrect result size", iter.hasNext() ); + assertTrue( "Incorrect return type", iter.next() instanceof Animal ); + + session.close(); + + session = openSession(); + + ScrollableResults sr = session.createQuery( query ) + .setResultTransformer(Transformers.aliasToBean(Animal.class)).scroll(); + assertTrue( "Incorrect result size", sr.next() ); + assertTrue( "Incorrect return type", sr.get(0) instanceof Animal ); + assertFalse(session.contains(sr.get(0))); + sr.close(); + + session.close(); + + session = openSession(); + + results = session.createQuery( "select a from Animal a, Animal b" ) + .setResultTransformer(new DistinctRootEntityResultTransformer()) + .list(); + assertEquals( "Incorrect result size", 2, results.size()); + assertTrue( "Incorrect return type", results.get(0) instanceof Animal ); + firstAnimal = (Animal) results.get(0); + secondAnimal = (Animal) results.get(1); + assertEquals("Mammal #1", firstAnimal.getDescription()); + assertEquals("Mammal #2", secondAnimal.getDescription()); + + session.close(); + + destroyTestBaseData(); + } + + public void testResultTransformerEntityQueries() throws Exception { + + createTestBaseData(); + + String query = "select an as an from Animal an order by bodyWeight desc"; + + Session session = openSession(); + + List results = session.createQuery( query ) + .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list(); + assertEquals( "Incorrect result size", results.size(), 2 ); + assertTrue( "Incorrect return type", results.get(0) instanceof Map ); + Map map = ((Map) results.get(0)); + assertEquals(1, map.size()); + Animal firstAnimal = (Animal) map.get("an"); + map = ((Map) results.get(1)); + Animal secondAnimal = (Animal) map.get("an"); + assertEquals("Mammal #1", firstAnimal.getDescription()); + assertEquals("Mammal #2", secondAnimal.getDescription()); + assertTrue(session.contains(firstAnimal)); + assertSame(firstAnimal, session.get(Animal.class,firstAnimal.getId())); + session.close(); + + session = openSession(); + + Iterator iter = session.createQuery( query ) + .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).iterate(); + assertTrue( "Incorrect result size", iter.hasNext() ); + map = (Map) iter.next(); + firstAnimal = (Animal) map.get("an"); + assertEquals("Mammal #1", firstAnimal.getDescription()); + assertTrue( "Incorrect result size", iter.hasNext() ); + + session.close(); + + session = openSession(); + + ScrollableResults sr = session.createQuery( query ) + .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).scroll(); + assertTrue( "Incorrect result size", sr.next() ); + assertTrue( "Incorrect return type", sr.get(0) instanceof Map ); + assertFalse(session.contains(sr.get(0))); + sr.close(); + + session.close(); + + destroyTestBaseData(); + } + public void testEJBQLFunctions() throws Exception { Session session = openSession(); Modified: trunk/Hibernate3/test/org/hibernate/test/legacy/FumTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/legacy/FumTest.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/test/org/hibernate/test/legacy/FumTest.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -40,6 +40,7 @@ import org.hibernate.dialect.PointbaseDialect; import org.hibernate.dialect.TimesTenDialect; import org.hibernate.transform.AliasToBeanResultTransformer; +import org.hibernate.transform.Transformers; import org.hibernate.type.DateType; import org.hibernate.type.EntityType; import org.hibernate.type.StringType; @@ -223,7 +224,7 @@ Criteria base = s.createCriteria(Fum.class, "fum") .add( Expression.like("fum", "f%") ) - .setResultTransformer(new AliasToBeanResultTransformer(ABean.class)) + .setResultTransformer(Transformers.aliasToBean(ABean.class)) .setFetchMode("friends", FetchMode.JOIN); base.createCriteria("fo", "fo") .add( Expression.eq( "fum", fum.getFo().getFum() ) ); Modified: trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -2,6 +2,7 @@ package org.hibernate.test.querycache; import java.util.List; +import java.util.Map; import junit.framework.Test; import junit.framework.TestSuite; @@ -15,6 +16,7 @@ import org.hibernate.stat.QueryStatistics; import org.hibernate.stat.CollectionStatistics; import org.hibernate.test.TestCase; +import org.hibernate.transform.Transformers; /** * @author Gavin King @@ -201,6 +203,28 @@ s = openSession(); t = s.beginTransaction(); + result = s.createQuery( queryString ).setCacheable(true).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list(); + assertEquals( result.size(), 1 ); + Map m = (Map) result.get(0); + assertEquals(1, m.size()); + t.commit(); + s.close(); + + assertEquals( "hit count should not go up since we are adding a resulttransformer", qs.getCacheHitCount(), 1 ); + + s = openSession(); + t = s.beginTransaction(); + result = s.createQuery( queryString ).setCacheable(true).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list(); + assertEquals( result.size(), 1 ); + m = (Map) result.get(0); + assertEquals(1, m.size()); + t.commit(); + s.close(); + + assertEquals( "hit count should go up since we are using the same resulttransformer", qs.getCacheHitCount(), 2 ); + + s = openSession(); + t = s.beginTransaction(); result = s.createQuery( queryString ).setCacheable(true).list(); assertEquals( result.size(), 1 ); assertTrue( Hibernate.isInitialized( result.get(0) ) ); @@ -210,8 +234,8 @@ t.commit(); s.close(); - assertEquals( qs.getCacheHitCount(), 2 ); - assertEquals( qs.getCacheMissCount(), 2 ); + assertEquals( qs.getCacheHitCount(), 3 ); + assertEquals( qs.getCacheMissCount(), 3 ); Thread.sleep(200); @@ -226,10 +250,10 @@ t.commit(); s.close(); - assertEquals( qs.getCacheHitCount(), 2 ); - assertEquals( qs.getCacheMissCount(), 3 ); - assertEquals( qs.getCachePutCount(), 3 ); - assertEquals( qs.getExecutionCount(), 3 ); + assertEquals( qs.getCacheHitCount(), 3 ); + assertEquals( qs.getCacheMissCount(), 4 ); + assertEquals( qs.getCachePutCount(), 4 ); + assertEquals( qs.getExecutionCount(), 4 ); assertEquals( es.getFetchCount(), 0 ); //check that it was being cached } Modified: trunk/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java 2006-03-16 13:56:41 UTC (rev 9635) +++ trunk/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java 2006-03-16 14:14:48 UTC (rev 9636) @@ -3,21 +3,25 @@ import java.io.Serializable; import java.util.Iterator; import java.util.List; +import java.util.Map; -import org.hibernate.test.TestCase; +import junit.framework.Test; +import junit.framework.TestSuite; + import org.hibernate.Hibernate; +import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; -import org.hibernate.HibernateException; import org.hibernate.Transaction; +import org.hibernate.test.TestCase; +import org.hibernate.transform.DistinctRootEntityResultTransformer; +import org.hibernate.transform.Transformers; /** * @author Steve Ebersole */ public class GeneralTest extends TestCase { - // TODO : add this to AllTests once Max verifies; or delete it :) - public GeneralTest(String x) { super( x ); } @@ -100,11 +104,6 @@ .addJoin("emp", "org.employments") .addScalar("regionCode", Hibernate.STRING) .list(); -// List l = s.createSQLQuery("select {org.*}, {emp.*}, emp.regionCode from organization org left outer join employment emp on org.orgid = emp.employer") -// .addEntity("org", Organization.class) -// .addJoin("emp", "org.employments") -// .addScalar("regionCode", Hibernate.STRING) -// .list(); assertEquals( l.size(), 2 ); l = s.createSQLQuery( getOrgEmpPersonSQL() ) @@ -112,13 +111,29 @@ .addJoin("emp", "org.employments") .addJoin("pers", "emp.employee") .list(); -// l = s.createSQLQuery("select {org.*}, {emp.*}, {pers.*} from organization org join employment emp on org.orgid = emp.employer join person pers on pers.perid = emp.employee") -// .addEntity("org", Organization.class) -// .addJoin("emp", "org.employments") -// .addJoin("pers", "emp.employee") -// .list(); assertEquals( l.size(), 1 ); + + t.commit(); + s.close(); + + s = openSession(); + t = s.beginTransaction(); + + l = s.createSQLQuery( "select {org.*}, {emp.*} " + + "from ORGANIZATION org " + + " left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER, ORGANIZATION org2" ) + .addEntity("org", Organization.class) + .addJoin("emp", "org.employments") + .setResultTransformer(new DistinctRootEntityResultTransformer()) + .list(); + assertEquals( l.size(), 2 ); + t.commit(); + s.close(); + + s = openSession(); + t = s.beginTransaction(); + s.delete(emp); s.delete(gavin); s.delete(ifa); @@ -144,17 +159,11 @@ List l = s.createSQLQuery( getOrgEmpRegionSQL() ) .setResultSetMapping( "org-emp-regionCode" ) .list(); -// List l = s.createSQLQuery("select {org.*}, {emp.*}, emp.regionCode from organization org left outer join employment emp on org.orgid = emp.employer") -// .setResultSetMapping( "org-emp-regionCode") -// .list(); assertEquals( l.size(), 2 ); l = s.createSQLQuery( getOrgEmpPersonSQL() ) .setResultSetMapping( "org-emp-person" ) .list(); -// l = s.createSQLQuery("select {org.*}, {emp.*}, {pers.*} from organization org join employment emp on org.orgid = emp.employer join person pers on pers.perid = emp.employee") -// .setResultSetMapping( "org-emp-person" ) -// .list(); assertEquals( l.size(), 1 ); s.delete(emp); @@ -182,6 +191,12 @@ assertTrue( result.contains( "IFA" ) ); assertTrue( result.contains( "JBoss" ) ); + result = s.getNamedQuery( "orgNamesOnly" ).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list(); + Map m = (Map) result.get(0); + assertEquals( 2, result.size() ); + assertEquals( 1, m.size() ); + assertTrue( m.containsKey("NAME") ); + t.commit(); s.close(); @@ -258,13 +273,41 @@ s = openSession(); t = s.beginTransaction(); + Query sqlQuery = s.getNamedQuery("EmploymentAndPerson"); + sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); + list = sqlQuery.list(); + assertEquals(1,list.size() ); + Object res = list.get(0); + assertClassAssignability(res.getClass(),Map.class); + Map m = (Map) res; + assertEquals(2,m.size()); + t.commit(); + s.close(); + + s = openSession(); + t = s.beginTransaction(); + sqlQuery = s.getNamedQuery("organizationreturnproperty"); + sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); + list = sqlQuery.list(); + assertEquals(2,list.size() ); + m = (Map) list.get(0); + assertTrue(m.containsKey("org")); + assertClassAssignability(m.get("org").getClass(), Organization.class); + assertTrue(m.containsKey("emp")); + assertClassAssignability(m.get("emp").getClass(), Employment.class); + assertEquals(2, m.size()); + t.commit(); + s.close(); + + s = openSession(); + t = s.beginTransaction(); namedQuery = s.getNamedQuery("EmploymentAndPerson"); list = namedQuery.list(); assertEquals(1,list.size() ); Object[] objs = (Object[]) list.get(0); assertEquals(2, objs.length); emp2 = (Employment) objs[0]; - gavin = (Person) objs[1]; + gavin = (Person) objs[1]; s.delete(emp2); s.delete(jboss); s.delete(gavin); @@ -292,8 +335,6 @@ List list = s.createSQLQuery( getEmploymentSQL() ) .addEntity( Employment.class.getName() ) .list(); -// Query namedQuery = s.createSQLQuery("SELECT * FROM EMPLOYMENT").addEntity( Employment.class.getName() ); -// List list = namedQuery.list(); assertEquals( 1,list.size() ); Employment emp2 = (Employment) list.get(0); @@ -303,6 +344,28 @@ s.clear(); + list = s.createSQLQuery( getEmploymentSQL() ) + .addEntity( Employment.class.getName() ) + .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP) + .list(); + assertEquals( 1,list.size() ); + Map m = (Map) list.get(0); + assertTrue(m.containsKey("Employment")); + assertEquals(1,m.size()); + + list = s.createSQLQuery(getEmploymentSQL()).list(); + assertEquals(1, list.size()); + Object[] o = (Object[]) list.get(0); + assertEquals(8, o.length); + + list = s.createSQLQuery(getEmploymentSQL()).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list(); + assertEquals(1, list.size()); + m = (Map) list.get(0); + assertTrue(m.containsKey("EMPID")); + assertTrue(m.containsKey("VALUE")); + assertTrue(m.containsKey("ENDDATE")); + assertEquals(8, m.size()); + Query queryWithCollection = s.getNamedQuery("organizationEmploymentsExplicitAliases"); queryWithCollection.setLong("id", jboss.getId() ); list = queryWithCollection.list(); @@ -314,12 +377,6 @@ .addEntity( "org", Organization.class ) .addJoin( "emp", "org.employments" ) .list(); -// Query queryWithJoin = s.createSQLQuery( -// "SELECT org.orgid as {org.id}, org.name as {org.name}, {emp.*} FROM ORGANIZATION org LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER ") -// .addEntity("org", Organization.class).addJoin("emp", "org.employments"); -// -// queryWithJoin.list(); -// list = queryWithJoin.list(); assertEquals( 2,list.size() ); s.clear(); @@ -328,20 +385,6 @@ .addEntity( "org", Organization.class ) .addJoin( "emp", "org.employments" ) .list(); -// queryWithJoin = s.createSQLQuery( -// "SELECT org.orgid as {org.id}, org.name as {org.name}, emp.employer as {emp.key}, emp.empid as {emp.element}, {emp.element.*} FROM ORGANIZATION org LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER ") -// .addEntity("org", Organization.class).addJoin("emp", "org.employments"); -// -// list = queryWithJoin.list(); -// assertEquals( 2,list.size() ); -// -// s.clear(); -// -// queryWithJoin = s.createSQLQuery( -// "SELECT org.orgid as {org.id}, org.name as {org.name}, emp.employer as {emp.key}, emp.empid as {emp.element}, {emp.element.*} FROM ORGANIZATION org LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER ") -// .addEntity("org", Organization.class).addJoin("emp", "org.employments"); -// -// list = queryWithJoin.list(); assertEquals( 2,list.size() ); s.clear(); @@ -349,19 +392,11 @@ // TODO : why twice? s.getNamedQuery( "organizationreturnproperty" ).list(); list = s.getNamedQuery( "organizationreturnproperty" ).list(); -// queryWithJoin = s.getNamedQuery("organizationreturnproperty"); -// queryWithJoin.list(); -// -// list = queryWithJoin.list(); assertEquals( 2,list.size() ); s.clear(); list = s.getNamedQuery( "organizationautodetect" ).list(); -// queryWithJoin = s.getNamedQuery("organizationautodetect"); -// queryWithJoin.list(); -// -// list = queryWithJoin.list(); assertEquals( 2,list.size() ); t.commit(); @@ -379,6 +414,8 @@ } + public static Test suite() { + return new TestSuite(GeneralTest.class); + } - } |
From: <hib...@li...> - 2006-03-16 13:56:47
|
Author: max...@jb... Date: 2006-03-16 08:56:41 -0500 (Thu, 16 Mar 2006) New Revision: 9635 Modified: trunk/Hibernate3/test/org/hibernate/test/criteria/CriteriaQueryTest.java Log: enable query caching for CriteriaCachaTest so the cache actually gets tested. Modified: trunk/Hibernate3/test/org/hibernate/test/criteria/CriteriaQueryTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/criteria/CriteriaQueryTest.java 2006-03-16 13:55:44 UTC (rev 9634) +++ trunk/Hibernate3/test/org/hibernate/test/criteria/CriteriaQueryTest.java 2006-03-16 13:56:41 UTC (rev 9635) @@ -13,12 +13,22 @@ import org.hibernate.ScrollableResults; import org.hibernate.Session; import org.hibernate.Transaction; -import org.hibernate.criterion.*; -import org.hibernate.dialect.HSQLDialect; +import org.hibernate.cfg.Configuration; +import org.hibernate.cfg.Environment; +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Expression; +import org.hibernate.criterion.MatchMode; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Projection; +import org.hibernate.criterion.Projections; +import org.hibernate.criterion.Property; +import org.hibernate.criterion.Restrictions; +import org.hibernate.criterion.Subqueries; import org.hibernate.test.TestCase; +import org.hibernate.test.hql.Animal; import org.hibernate.test.hql.Reptile; -import org.hibernate.test.hql.Animal; import org.hibernate.transform.AliasToBeanResultTransformer; +import org.hibernate.transform.Transformers; import org.hibernate.type.Type; import org.hibernate.util.SerializationHelper; @@ -162,112 +172,112 @@ session.close(); } - public void testProjectionCache() { - Session s = openSession(); - Transaction t = s.beginTransaction(); + public void testProjectionCache() { + Session s = openSession(); + Transaction t = s.beginTransaction(); + + Course course = new Course(); + course.setCourseCode("HIB"); + course.setDescription("Hibernate Training"); + s.save(course); + + Student gavin = new Student(); + gavin.setName("Gavin King"); + gavin.setStudentNumber(666); + s.save(gavin); + + Student xam = new Student(); + xam.setName("Max Rydahl Andersen"); + xam.setStudentNumber(101); + s.save(xam); + + Enrolment enrolment1 = new Enrolment(); + enrolment1.setCourse(course); + enrolment1.setCourseCode(course.getCourseCode()); + enrolment1.setSemester((short) 1); + enrolment1.setYear((short) 1999); + enrolment1.setStudent(xam); + enrolment1.setStudentNumber(xam.getStudentNumber()); + xam.getEnrolments().add(enrolment1); + s.save(enrolment1); + + Enrolment enrolment2 = new Enrolment(); + enrolment2.setCourse(course); + enrolment2.setCourseCode(course.getCourseCode()); + enrolment2.setSemester((short) 3); + enrolment2.setYear((short) 1998); + enrolment2.setStudent(gavin); + enrolment2.setStudentNumber(gavin.getStudentNumber()); + gavin.getEnrolments().add(enrolment2); + s.save(enrolment2); + + List list = s.createCriteria(Enrolment.class) + .createAlias("student", "s") + .createAlias("course", "c") + .add( Restrictions.isNotEmpty("s.enrolments") ) + .setProjection( Projections.projectionList() + .add( Projections.property("s.name") ) + .add( Projections.property("c.description") ) + ) + .setCacheable(true) + .list(); + + assertEquals( list.size(), 2 ); + assertEquals( ( (Object[]) list.get(0) ).length, 2 ); + assertEquals( ( (Object[]) list.get(1) ).length, 2 ); + + t.commit(); + s.close(); + + s = openSession(); + t = s.beginTransaction(); + + s.createCriteria(Enrolment.class) + .createAlias("student", "s") + .createAlias("course", "c") + .add( Restrictions.isNotEmpty("s.enrolments") ) + .setProjection( Projections.projectionList() + .add( Projections.property("s.name") ) + .add( Projections.property("c.description") ) + ) + .setCacheable(true) + .list(); - Course course = new Course(); - course.setCourseCode("HIB"); - course.setDescription("Hibernate Training"); - s.save(course); - - Student gavin = new Student(); - gavin.setName("Gavin King"); - gavin.setStudentNumber(666); - s.save(gavin); - - Student xam = new Student(); - xam.setName("Max Rydahl Andersen"); - xam.setStudentNumber(101); - s.save(xam); - - Enrolment enrolment1 = new Enrolment(); - enrolment1.setCourse(course); - enrolment1.setCourseCode(course.getCourseCode()); - enrolment1.setSemester((short) 1); - enrolment1.setYear((short) 1999); - enrolment1.setStudent(xam); - enrolment1.setStudentNumber(xam.getStudentNumber()); - xam.getEnrolments().add(enrolment1); - s.save(enrolment1); - - Enrolment enrolment2 = new Enrolment(); - enrolment2.setCourse(course); - enrolment2.setCourseCode(course.getCourseCode()); - enrolment2.setSemester((short) 3); - enrolment2.setYear((short) 1998); - enrolment2.setStudent(gavin); - enrolment2.setStudentNumber(gavin.getStudentNumber()); - gavin.getEnrolments().add(enrolment2); - s.save(enrolment2); - - List list = s.createCriteria(Enrolment.class) - .createAlias("student", "s") - .createAlias("course", "c") - .add( Restrictions.isNotEmpty("s.enrolments") ) - .setProjection( Projections.projectionList() - .add( Projections.property("s.name") ) - .add( Projections.property("c.description") ) - ) - .setCacheable(true) - .list(); - - assertEquals( list.size(), 2 ); - assertEquals( ( (Object[]) list.get(0) ).length, 2 ); - assertEquals( ( (Object[]) list.get(1) ).length, 2 ); - - t.commit(); - s.close(); - - s = openSession(); - t = s.beginTransaction(); - - s.createCriteria(Enrolment.class) - .createAlias("student", "s") - .createAlias("course", "c") - .add( Restrictions.isNotEmpty("s.enrolments") ) - .setProjection( Projections.projectionList() - .add( Projections.property("s.name") ) - .add( Projections.property("c.description") ) - ) - .setCacheable(true) - .list(); + assertEquals( list.size(), 2 ); + assertEquals( ( (Object[]) list.get(0) ).length, 2 ); + assertEquals( ( (Object[]) list.get(1) ).length, 2 ); + + t.commit(); + s.close(); - assertEquals( list.size(), 2 ); - assertEquals( ( (Object[]) list.get(0) ).length, 2 ); - assertEquals( ( (Object[]) list.get(1) ).length, 2 ); + s = openSession(); + t = s.beginTransaction(); + + s.createCriteria(Enrolment.class) + .createAlias("student", "s") + .createAlias("course", "c") + .add( Restrictions.isNotEmpty("s.enrolments") ) + .setProjection( Projections.projectionList() + .add( Projections.property("s.name") ) + .add( Projections.property("c.description") ) + ) + .setCacheable(true) + .list(); + + assertEquals( list.size(), 2 ); + assertEquals( ( (Object[]) list.get(0) ).length, 2 ); + assertEquals( ( (Object[]) list.get(1) ).length, 2 ); + + s.delete(enrolment1); + s.delete(enrolment2); + s.delete(course); + s.delete(gavin); + s.delete(xam); - t.commit(); - s.close(); - - s = openSession(); - t = s.beginTransaction(); - - s.createCriteria(Enrolment.class) - .createAlias("student", "s") - .createAlias("course", "c") - .add( Restrictions.isNotEmpty("s.enrolments") ) - .setProjection( Projections.projectionList() - .add( Projections.property("s.name") ) - .add( Projections.property("c.description") ) - ) - .setCacheable(true) - .list(); - - assertEquals( list.size(), 2 ); - assertEquals( ( (Object[]) list.get(0) ).length, 2 ); - assertEquals( ( (Object[]) list.get(1) ).length, 2 ); - - s.delete(enrolment1); - s.delete(enrolment2); - s.delete(course); - s.delete(gavin); - s.delete(xam); + t.commit(); + s.close(); + } - t.commit(); - s.close(); -} - public void testProjections() { Session s = openSession(); Transaction t = s.beginTransaction(); @@ -369,7 +379,7 @@ .add( Projections.property("co.description"), "courseDescription" ) ) .addOrder( Order.desc("studentName") ) - .setResultTransformer( new AliasToBeanResultTransformer(StudentDTO.class) ) + .setResultTransformer( Transformers.aliasToBean(StudentDTO.class) ) .list(); assertEquals(2, resultWithAliasedBean.size()); @@ -551,7 +561,7 @@ .add( Property.forName("co.description").as("courseDescription") ) ) .addOrder( Order.desc("studentName") ) - .setResultTransformer( new AliasToBeanResultTransformer(StudentDTO.class) ) + .setResultTransformer( Transformers.aliasToBean(StudentDTO.class) ) .list(); assertEquals(2, resultWithAliasedBean.size()); @@ -742,5 +752,12 @@ return new TestSuite(CriteriaQueryTest.class); } + protected void configure(Configuration cfg) { + super.configure( cfg ); + cfg.setProperty( Environment.USE_QUERY_CACHE, "true" ); + cfg.setProperty( Environment.CACHE_REGION_PREFIX, "criteriaquerytest" ); + cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "true" ); + cfg.setProperty( Environment.GENERATE_STATISTICS, "true" ); + } } |
From: <hib...@li...> - 2006-03-16 13:55:47
|
Author: max...@jb... Date: 2006-03-16 08:55:44 -0500 (Thu, 16 Mar 2006) New Revision: 9634 Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java Log: add GeneralTest to alltest Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-16 09:13:28 UTC (rev 9633) +++ trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-16 13:55:44 UTC (rev 9634) @@ -103,6 +103,7 @@ import org.hibernate.test.sorted.SortTest; import org.hibernate.test.sql.DataDirectOracleSQLTest; import org.hibernate.test.sql.Db2SQLTest; +import org.hibernate.test.sql.GeneralTest; import org.hibernate.test.sql.MSSQLTest; import org.hibernate.test.sql.MySQLTest; import org.hibernate.test.sql.OracleSQLTest; @@ -225,6 +226,7 @@ suite.addTest( OracleSQLTest.suite() ); suite.addTest( MSSQLTest.suite() ); suite.addTest( MySQLTest.suite() ); + suite.addTest( GeneralTest.suite() ); suite.addTest( CriteriaQueryTest.suite() ); suite.addTest( SubselectTest.suite() ); suite.addTest( SubselectFetchTest.suite() ); |
From: <hib...@li...> - 2006-03-16 09:13:34
|
Author: max...@jb... Date: 2006-03-16 04:13:28 -0500 (Thu, 16 Mar 2006) New Revision: 9633 Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/AllTests.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java Log: add GeneralTest to alltest Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/AllTests.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-16 04:33:50 UTC (rev 9632) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-16 09:13:28 UTC (rev 9633) @@ -102,6 +102,7 @@ import org.hibernate.test.sorted.SortTest; import org.hibernate.test.sql.DataDirectOracleSQLTest; import org.hibernate.test.sql.Db2SQLTest; +import org.hibernate.test.sql.GeneralTest; import org.hibernate.test.sql.MSSQLTest; import org.hibernate.test.sql.MySQLTest; import org.hibernate.test.sql.OracleSQLTest; @@ -268,6 +269,7 @@ suite.addTest( OracleSQLTest.suite() ); suite.addTest( MSSQLTest.suite() ); suite.addTest( MySQLTest.suite() ); + suite.addTest( GeneralTest.suite() ); suite.addTest( CriteriaQueryTest.suite() ); suite.addTest( SubselectTest.suite() ); suite.addTest( SubselectFetchTest.suite() ); Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java 2006-03-16 04:33:50 UTC (rev 9632) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java 2006-03-16 09:13:28 UTC (rev 9633) @@ -4,6 +4,9 @@ import java.util.Iterator; import java.util.List; +import junit.framework.Test; +import junit.framework.TestSuite; + import org.hibernate.test.TestCase; import org.hibernate.Hibernate; import org.hibernate.Query; @@ -16,7 +19,6 @@ */ public class GeneralTest extends TestCase { - // TODO : add this to AllTests once Max verifies; or delete it :) public GeneralTest(String x) { super( x ); @@ -100,11 +102,6 @@ .addJoin("emp", "org.employments") .addScalar("regionCode", Hibernate.STRING) .list(); -// List l = s.createSQLQuery("select {org.*}, {emp.*}, emp.regionCode from organization org left outer join employment emp on org.orgid = emp.employer") -// .addEntity("org", Organization.class) -// .addJoin("emp", "org.employments") -// .addScalar("regionCode", Hibernate.STRING) -// .list(); assertEquals( l.size(), 2 ); l = s.createSQLQuery( getOrgEmpPersonSQL() ) @@ -112,11 +109,6 @@ .addJoin("emp", "org.employments") .addJoin("pers", "emp.employee") .list(); -// l = s.createSQLQuery("select {org.*}, {emp.*}, {pers.*} from organization org join employment emp on org.orgid = emp.employer join person pers on pers.perid = emp.employee") -// .addEntity("org", Organization.class) -// .addJoin("emp", "org.employments") -// .addJoin("pers", "emp.employee") -// .list(); assertEquals( l.size(), 1 ); s.delete(emp); @@ -144,17 +136,11 @@ List l = s.createSQLQuery( getOrgEmpRegionSQL() ) .setResultSetMapping( "org-emp-regionCode" ) .list(); -// List l = s.createSQLQuery("select {org.*}, {emp.*}, emp.regionCode from organization org left outer join employment emp on org.orgid = emp.employer") -// .setResultSetMapping( "org-emp-regionCode") -// .list(); assertEquals( l.size(), 2 ); l = s.createSQLQuery( getOrgEmpPersonSQL() ) .setResultSetMapping( "org-emp-person" ) .list(); -// l = s.createSQLQuery("select {org.*}, {emp.*}, {pers.*} from organization org join employment emp on org.orgid = emp.employer join person pers on pers.perid = emp.employee") -// .setResultSetMapping( "org-emp-person" ) -// .list(); assertEquals( l.size(), 1 ); s.delete(emp); @@ -292,8 +278,6 @@ List list = s.createSQLQuery( getEmploymentSQL() ) .addEntity( Employment.class.getName() ) .list(); -// Query namedQuery = s.createSQLQuery("SELECT * FROM EMPLOYMENT").addEntity( Employment.class.getName() ); -// List list = namedQuery.list(); assertEquals( 1,list.size() ); Employment emp2 = (Employment) list.get(0); @@ -314,12 +298,6 @@ .addEntity( "org", Organization.class ) .addJoin( "emp", "org.employments" ) .list(); -// Query queryWithJoin = s.createSQLQuery( -// "SELECT org.orgid as {org.id}, org.name as {org.name}, {emp.*} FROM ORGANIZATION org LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER ") -// .addEntity("org", Organization.class).addJoin("emp", "org.employments"); -// -// queryWithJoin.list(); -// list = queryWithJoin.list(); assertEquals( 2,list.size() ); s.clear(); @@ -328,20 +306,6 @@ .addEntity( "org", Organization.class ) .addJoin( "emp", "org.employments" ) .list(); -// queryWithJoin = s.createSQLQuery( -// "SELECT org.orgid as {org.id}, org.name as {org.name}, emp.employer as {emp.key}, emp.empid as {emp.element}, {emp.element.*} FROM ORGANIZATION org LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER ") -// .addEntity("org", Organization.class).addJoin("emp", "org.employments"); -// -// list = queryWithJoin.list(); -// assertEquals( 2,list.size() ); -// -// s.clear(); -// -// queryWithJoin = s.createSQLQuery( -// "SELECT org.orgid as {org.id}, org.name as {org.name}, emp.employer as {emp.key}, emp.empid as {emp.element}, {emp.element.*} FROM ORGANIZATION org LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER ") -// .addEntity("org", Organization.class).addJoin("emp", "org.employments"); -// -// list = queryWithJoin.list(); assertEquals( 2,list.size() ); s.clear(); @@ -349,19 +313,11 @@ // TODO : why twice? s.getNamedQuery( "organizationreturnproperty" ).list(); list = s.getNamedQuery( "organizationreturnproperty" ).list(); -// queryWithJoin = s.getNamedQuery("organizationreturnproperty"); -// queryWithJoin.list(); -// -// list = queryWithJoin.list(); assertEquals( 2,list.size() ); s.clear(); list = s.getNamedQuery( "organizationautodetect" ).list(); -// queryWithJoin = s.getNamedQuery("organizationautodetect"); -// queryWithJoin.list(); -// -// list = queryWithJoin.list(); assertEquals( 2,list.size() ); t.commit(); @@ -379,6 +335,9 @@ } + public static Test suite() { + return new TestSuite(GeneralTest.class); + } } |
From: <hib...@li...> - 2006-03-16 04:33:53
|
Author: ste...@jb... Date: 2006-03-15 23:33:50 -0500 (Wed, 15 Mar 2006) New Revision: 9632 Added: tags/v32alpha2/Hibernate3/ Log: tagging 3.2 alpha-2 Copied: tags/v32alpha2/Hibernate3 (from rev 9631, trunk/Hibernate3) |
From: <hib...@li...> - 2006-03-16 04:31:53
|
Author: ste...@jb... Date: 2006-03-15 23:31:47 -0500 (Wed, 15 Mar 2006) New Revision: 9631 Added: tags/v32alpha2/ Log: created 3.2 alpha-2 release directory |
From: <hib...@li...> - 2006-03-16 03:53:31
|
Author: ste...@jb... Date: 2006-03-15 22:53:24 -0500 (Wed, 15 Mar 2006) New Revision: 9630 Added: tags/v32alpha1/Hibernate3/ Log: Copied: tags/v32alpha1/Hibernate3 (from rev 9629, trunk/Hibernate3) |
From: <hib...@li...> - 2006-03-16 03:47:32
|
Author: ste...@jb... Date: 2006-03-15 22:47:25 -0500 (Wed, 15 Mar 2006) New Revision: 9629 Modified: trunk/Hibernate3/build.xml trunk/Hibernate3/changelog.txt trunk/Hibernate3/doc/reference/en/master.xml trunk/Hibernate3/readme.txt trunk/Hibernate3/src/org/hibernate/cfg/Environment.java Log: prep 3.2 alpha2 Modified: trunk/Hibernate3/build.xml =================================================================== --- trunk/Hibernate3/build.xml 2006-03-15 19:15:17 UTC (rev 9628) +++ trunk/Hibernate3/build.xml 2006-03-16 03:47:25 UTC (rev 9629) @@ -19,7 +19,7 @@ <property name="version.major" value="3"/> <property name="version.minor" value="2"/> <property name="version.micro" value="0"/> - <property name="version.qualifier" value="alpha1"/> + <property name="version.qualifier" value="alpha2"/> <property name="version.full" value="${version.major}.${version.minor}.${version.micro}.${version.qualifier}"/> <property name="version.major_minor" value="${version.major}.${version.minor}"/> <property name="fullname" value="${name}-${version.full}"/> Modified: trunk/Hibernate3/changelog.txt =================================================================== --- trunk/Hibernate3/changelog.txt 2006-03-15 19:15:17 UTC (rev 9628) +++ trunk/Hibernate3/changelog.txt 2006-03-16 03:47:25 UTC (rev 9629) @@ -5,6 +5,23 @@ refer to the particular case on JIRA using the issue tracking number to learn more about each case. + +Chages in version 3.2 alpha2 (2006.03.15) +------------------------------------------- + +** Bug + * [HHH-535] - properties element causes exception in interface/abstract class + * [HHH-1325] - ArrayOutOfBounds expected in DatabaseMetadata.isTable when specifing schema + * [HHH-1435] - many-to-one lazy seems to be broken in 3.1.x + * [HHH-1531] - NPE with many-to-many and property-ref + * [HHH-1546] - generated version properties fail with multiple actions per flush + +** Improvement + * [HHH-1540] - Better Error Feedback In CollectionEntry.postFlush(PersistentCollection) + * [HHH-1555] - ConnectionReleaseMode.AFTER_STATEMENT and flushes + * [HHH-1559] - introduce TransactionFactory.isTransactionInProgress to facilitate EJB3 joinTransaction handling + + Chages in version 3.2 alpha1 (2006.02.28) ------------------------------------------- Modified: trunk/Hibernate3/doc/reference/en/master.xml =================================================================== --- trunk/Hibernate3/doc/reference/en/master.xml 2006-03-15 19:15:17 UTC (rev 9628) +++ trunk/Hibernate3/doc/reference/en/master.xml 2006-03-16 03:47:25 UTC (rev 9629) @@ -33,7 +33,7 @@ <bookinfo> <title>HIBERNATE - Relational Persistence for Idiomatic Java</title> <subtitle>Hibernate Reference Documentation</subtitle> - <releaseinfo>3.2 alpha1</releaseinfo> + <releaseinfo>3.2 alpha2</releaseinfo> </bookinfo> <toc/> Modified: trunk/Hibernate3/readme.txt =================================================================== --- trunk/Hibernate3/readme.txt 2006-03-15 19:15:17 UTC (rev 9628) +++ trunk/Hibernate3/readme.txt 2006-03-16 03:47:25 UTC (rev 9629) @@ -1,6 +1,6 @@ Hibernate - Relational Persistence for Idiomatic Java ===================================================== -version 3.2 alpha1, Feb 28, 2006 +version 3.2 alpha2, Mar 15, 2006 Instructions ------------ Modified: trunk/Hibernate3/src/org/hibernate/cfg/Environment.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cfg/Environment.java 2006-03-15 19:15:17 UTC (rev 9628) +++ trunk/Hibernate3/src/org/hibernate/cfg/Environment.java 2006-03-16 03:47:25 UTC (rev 9629) @@ -153,7 +153,7 @@ */ public final class Environment { - public static final String VERSION = "3.2 alpha1"; + public static final String VERSION = "3.2 alpha2"; /** * <tt>ConnectionProvider</tt> implementor to use when obtaining connections |
From: <hib...@li...> - 2006-03-15 19:15:20
|
Author: ste...@jb... Date: 2006-03-15 14:15:17 -0500 (Wed, 15 Mar 2006) New Revision: 9628 Modified: trunk/Hibernate3/src/org/hibernate/engine/TwoPhaseLoad.java trunk/Hibernate3/src/org/hibernate/engine/Versioning.java trunk/Hibernate3/src/org/hibernate/type/BinaryType.java Log: minor : logging of version values Modified: trunk/Hibernate3/src/org/hibernate/engine/TwoPhaseLoad.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/TwoPhaseLoad.java 2006-03-15 19:13:30 UTC (rev 9627) +++ trunk/Hibernate3/src/org/hibernate/engine/TwoPhaseLoad.java 2006-03-15 19:15:17 UTC (rev 9628) @@ -69,7 +69,10 @@ ); if ( log.isTraceEnabled() && version!=null ) { - log.trace( "Version: " + version ); + String versionStr = persister.isVersioned() + ? persister.getVersionType().toLoggableString( version, session.getFactory() ) + : "null"; + log.trace( "Version: " + versionStr ); } } Modified: trunk/Hibernate3/src/org/hibernate/engine/Versioning.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/Versioning.java 2006-03-15 19:13:30 UTC (rev 9627) +++ trunk/Hibernate3/src/org/hibernate/engine/Versioning.java 2006-03-15 19:15:17 UTC (rev 9628) @@ -23,7 +23,14 @@ */ public static Object increment(Object version, VersionType versionType, SessionImplementor session) { Object next = versionType.next( version, session ); - if ( log.isTraceEnabled() ) log.trace("Incrementing: " + version + " to " + next); + if ( log.isTraceEnabled() ) { + log.trace( + "Incrementing: " + + versionType.toLoggableString( version, session.getFactory() ) + + " to " + + versionType.toLoggableString( next, session.getFactory() ) + ); + } return next; } Modified: trunk/Hibernate3/src/org/hibernate/type/BinaryType.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/type/BinaryType.java 2006-03-15 19:13:30 UTC (rev 9627) +++ trunk/Hibernate3/src/org/hibernate/type/BinaryType.java 2006-03-15 19:15:17 UTC (rev 9628) @@ -85,7 +85,7 @@ } public Object next(Object current, SessionImplementor session) { - return null; + return current; } public Comparator getComparator() { |
From: <hib...@li...> - 2006-03-15 19:13:41
|
Author: ste...@jb... Date: 2006-03-15 14:13:30 -0500 (Wed, 15 Mar 2006) New Revision: 9627 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/TwoPhaseLoad.java branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/Versioning.java branches/Branch_3_1/Hibernate3/src/org/hibernate/type/BinaryType.java Log: minor : logging of version values Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/TwoPhaseLoad.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/TwoPhaseLoad.java 2006-03-15 09:39:51 UTC (rev 9626) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/TwoPhaseLoad.java 2006-03-15 19:13:30 UTC (rev 9627) @@ -69,7 +69,10 @@ ); if ( log.isTraceEnabled() && version!=null ) { - log.trace( "Version: " + version ); + String versionStr = persister.isVersioned() + ? persister.getVersionType().toLoggableString( version, session.getFactory() ) + : "null"; + log.trace( "Version: " + versionStr ); } } Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/Versioning.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/Versioning.java 2006-03-15 09:39:51 UTC (rev 9626) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/engine/Versioning.java 2006-03-15 19:13:30 UTC (rev 9627) @@ -23,7 +23,14 @@ */ public static Object increment(Object version, VersionType versionType, SessionImplementor session) { Object next = versionType.next( version, session ); - if ( log.isTraceEnabled() ) log.trace("Incrementing: " + version + " to " + next); + if ( log.isTraceEnabled() ) { + log.trace( + "Incrementing: " + + versionType.toLoggableString( version, session.getFactory() ) + + " to " + + versionType.toLoggableString( next, session.getFactory() ) + ); + } return next; } Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/type/BinaryType.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/type/BinaryType.java 2006-03-15 09:39:51 UTC (rev 9626) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/type/BinaryType.java 2006-03-15 19:13:30 UTC (rev 9627) @@ -85,7 +85,7 @@ } public Object next(Object current, SessionImplementor session) { - return null; + return current; } public Comparator getComparator() { |
From: <hib...@li...> - 2006-03-15 09:40:11
|
Author: epbernard Date: 2006-03-15 04:39:51 -0500 (Wed, 15 Mar 2006) New Revision: 9626 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java Log: more log Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java 2006-03-15 09:34:10 UTC (rev 9625) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java 2006-03-15 09:39:51 UTC (rev 9626) @@ -8,12 +8,15 @@ import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.engine.SessionImplementor; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * @author Gavin King */ public class EntityManagerImpl extends AbstractEntityManagerImpl { + private static Log log = LogFactory.getLog( EntityManagerImpl.class ); protected Session session; protected SessionFactory sessionFactory; protected boolean open; @@ -58,7 +61,10 @@ public void afterCompletion(int i) { //TODO should I check for isOpen() ? - if (session != null) session.close(); + if (session != null) { + log.debug( "Closing session after transaction completion"); + session.close(); + } //TODO session == null should not happen } } |
From: <hib...@li...> - 2006-03-15 09:35:11
|
Author: epbernard Date: 2006-03-15 04:34:10 -0500 (Wed, 15 Mar 2006) New Revision: 9625 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java Log: Safier transaction in progress Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-15 02:33:54 UTC (rev 9624) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-15 09:34:10 UTC (rev 9625) @@ -19,10 +19,10 @@ import javax.persistence.Query; import javax.persistence.TransactionRequiredException; import javax.persistence.spi.PersistenceUnitTransactionType; +import javax.transaction.Status; +import javax.transaction.Synchronization; 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; @@ -36,6 +36,7 @@ import org.hibernate.Session; import org.hibernate.StaleObjectStateException; import org.hibernate.UnresolvableObjectException; +import org.hibernate.Transaction; import org.hibernate.ejb.transaction.JoinableJTATransaction; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.engine.SessionImplementor; @@ -215,7 +216,7 @@ public abstract Session getSession(); public EntityTransaction getTransaction() { - if (transactionType == PersistenceUnitTransactionType.JTA) { + if ( transactionType == PersistenceUnitTransactionType.JTA ) { throw new IllegalStateException( "JTA EntityManager cannot access a transactions" ); } return tx; @@ -330,36 +331,42 @@ public void joinTransaction() { //set the joined status - if (transactionType == PersistenceUnitTransactionType.JTA) { + if ( transactionType == PersistenceUnitTransactionType.JTA ) { final Session session = getSession(); - final JoinableJTATransaction joinableJTATransaction = (JoinableJTATransaction) session.getTransaction(); - //register the clear on rollback - 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" ); - } - joinableJTATransaction.registerSynchronization( new Synchronization() { + final Transaction transaction = session.getTransaction(); + if ( transaction != null && transaction instanceof JoinableJTATransaction) { + //can't handle it if not a joinnable transaction + final JoinableJTATransaction joinableJTATransaction = (JoinableJTATransaction) session.getTransaction(); - public void beforeCompletion() { - } + 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 clear on rollback + joinableJTATransaction.registerSynchronization( + new Synchronization() { - public void afterCompletion(int status) { - if ( Status.STATUS_ROLLEDBACK == status - && transactionType == PersistenceUnitTransactionType.JTA) { - if ( session.isOpen() ) { - session.clear(); + public void beforeCompletion() { } + + public void afterCompletion(int status) { + if ( Status.STATUS_ROLLEDBACK == status + && transactionType == PersistenceUnitTransactionType.JTA ) { + if ( session.isOpen() ) { + session.clear(); + } + } + JoinableJTATransaction joinable = (JoinableJTATransaction) session.getTransaction(); + joinable.resetStatus(); + } } - JoinableJTATransaction joinable = (JoinableJTATransaction) session.getTransaction(); - joinable.resetStatus(); - } - } - ); + ); + } } } @@ -368,8 +375,10 @@ */ public Object getDelegate() { return getSession(); - }; + } + ; + private void writeObject(ObjectOutputStream oos) throws IOException { oos.defaultWriteObject(); } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java 2006-03-15 02:33:54 UTC (rev 9624) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java 2006-03-15 09:34:10 UTC (rev 9625) @@ -32,8 +32,8 @@ void tryJoiningTransaction() { if (status == JoinStatus.MARKED_FOR_JOINED) { try { - UserTransaction ut = getUserTransaction(); - if ( getUserTransaction() != null && JTAHelper.isInProgress( getUserTransaction().getStatus() ) ) { + UserTransaction ut = getUserTransaction(); + if ( ut != null && JTAHelper.isInProgress( ut.getStatus() ) ) { status = JoinStatus.JOINED; } else { @@ -62,6 +62,25 @@ if (status != JoinStatus.JOINED) status = JoinStatus.MARKED_FOR_JOINED; } + public boolean isTransactionInProgress() { + if (status != JoinableJTATransaction.JoinStatus.JOINED) { + return false; + } + try { + UserTransaction ut = getUserTransaction(); + if ( ut != null && JTAHelper.isInProgress( ut.getStatus() ) ) { + return true; + } + else { + resetStatus(); + return false; + } + } + catch( SystemException se ) { + throw new TransactionException( "Unable to check transaction status", se ); + } + } + public static enum JoinStatus { NOT_JOINED, MARKED_FOR_JOINED, Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java 2006-03-15 02:33:54 UTC (rev 9624) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java 2006-03-15 09:34:10 UTC (rev 9625) @@ -9,23 +9,23 @@ /** * 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); + throws HibernateException { + return new JoinableJTATransaction( context, utName, jdbcContext, transactionContext ); } @Override public boolean isTransactionInProgress( JDBCContext jdbcContext, Context transactionContext, Transaction transaction ) { - if (!super.isTransactionInProgress(jdbcContext, transactionContext, transaction)) return false; - if (transaction == null) return false; //should not happen though + if ( !super.isTransactionInProgress( jdbcContext, transactionContext, transaction ) ) return false; + if ( transaction == null ) return false; //should not happen though JoinableJTATransaction joinableJTATransaction = ( (JoinableJTATransaction) transaction ); joinableJTATransaction.tryJoiningTransaction(); - return joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.JOINED; + return joinableJTATransaction.isTransactionInProgress(); } } |
From: <hib...@li...> - 2006-03-15 02:34:41
|
Author: bi...@jb... Date: 2006-03-14 21:33:54 -0500 (Tue, 14 Mar 2006) New Revision: 9624 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java Log: clear JoinStatus at end of transaction and also when checking if within TX, also check the *REAL* JTA transaction Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-15 01:00:50 UTC (rev 9623) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-15 02:33:54 UTC (rev 9624) @@ -332,7 +332,8 @@ //set the joined status if (transactionType == PersistenceUnitTransactionType.JTA) { final Session session = getSession(); - JoinableJTATransaction joinableJTATransaction = (JoinableJTATransaction) session.getTransaction(); + final JoinableJTATransaction joinableJTATransaction = (JoinableJTATransaction) session.getTransaction(); + //register the clear on rollback if (joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.JOINED) return; //no-op joinableJTATransaction.markForJoined(); session.isOpen(); //register to the Tx @@ -342,8 +343,7 @@ else if (joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.MARKED_FOR_JOINED) { throw new AssertionFailure( "Transaction MARKED_FOR_JOINED after isOpen() call" ); } - //register the clear on rollback - joinableJTATransaction.registerSynchronization( new Synchronization() { + joinableJTATransaction.registerSynchronization( new Synchronization() { public void beforeCompletion() { } @@ -355,7 +355,9 @@ session.clear(); } } - } + JoinableJTATransaction joinable = (JoinableJTATransaction) session.getTransaction(); + joinable.resetStatus(); + } } ); } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java 2006-03-15 01:00:50 UTC (rev 9623) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java 2006-03-15 02:33:54 UTC (rev 9624) @@ -3,6 +3,7 @@ import javax.naming.InitialContext; import javax.transaction.SystemException; +import javax.transaction.UserTransaction; import org.hibernate.HibernateException; import org.hibernate.TransactionException; @@ -31,7 +32,8 @@ void tryJoiningTransaction() { if (status == JoinStatus.MARKED_FOR_JOINED) { try { - if ( getUserTransaction() != null && JTAHelper.isInProgress( getUserTransaction().getStatus() ) ) { + UserTransaction ut = getUserTransaction(); + if ( getUserTransaction() != null && JTAHelper.isInProgress( getUserTransaction().getStatus() ) ) { status = JoinStatus.JOINED; } else { @@ -54,7 +56,9 @@ return status; } - public void markForJoined() { + public void resetStatus() { status = JoinStatus.NOT_JOINED; } + + public void markForJoined() { if (status != JoinStatus.JOINED) status = JoinStatus.MARKED_FOR_JOINED; } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java 2006-03-15 01:00:50 UTC (rev 9623) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java 2006-03-15 02:33:54 UTC (rev 9624) @@ -22,7 +22,8 @@ public boolean isTransactionInProgress( JDBCContext jdbcContext, Context transactionContext, Transaction transaction ) { - if (transaction == null) return false; //should not happen though + if (!super.isTransactionInProgress(jdbcContext, transactionContext, transaction)) return false; + if (transaction == null) return false; //should not happen though JoinableJTATransaction joinableJTATransaction = ( (JoinableJTATransaction) transaction ); joinableJTATransaction.tryJoiningTransaction(); return joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.JOINED; |
Author: epbernard Date: 2006-03-14 20:00:50 -0500 (Tue, 14 Mar 2006) New Revision: 9623 Modified: trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java trunk/HibernateExt/ejb/build.xml trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java trunk/HibernateExt/ejb/src/test-resources/cfgxmlpar/META-INF/persistence.xml trunk/HibernateExt/ejb/src/test-resources/defaultpar/META-INF/persistence.xml trunk/HibernateExt/ejb/src/test-resources/excludehbmpar/META-INF/persistence.xml trunk/HibernateExt/ejb/src/test-resources/explicitpar/META-INF/persistence.xml trunk/HibernateExt/ejb/src/test-resources/explodedpar/META-INF/persistence.xml trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java Log: EJB-147 Modified: trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java 2006-03-15 01:00:50 UTC (rev 9623) @@ -231,6 +231,10 @@ this.entityResolver = entityResolver; } + public EntityResolver getEntityResolver() { + return entityResolver; + } + /** * Read mappings from a particular XML file * Modified: trunk/HibernateExt/ejb/build.xml =================================================================== --- trunk/HibernateExt/ejb/build.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/build.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -129,7 +129,11 @@ <target name="junit" depends="compiletest,test-resources"> <mkdir dir="test_output"/> <mkdir dir="${classes.dir}/META-INF/services"/> - <copy file="${resources.dir}/META-INF/services/javax.persistence.spi.PersistenceProvider" todir="${classes.dir}/META-INF/services"/> + <copy todir="${classes.dir}"> + <fileset dir="${resources.dir}"> + <include name="**/*.*"/> + </fileset> + </copy> <junit fork="once" printsummary="yes" haltonfailure="yes"> <classpath> <fileset dir="${jdbc.dir}"> @@ -188,7 +192,11 @@ <target name="jar" depends="compile" description="Build the distribution .jar file"> <mkdir dir="${classes.dir}/META-INF/services"/> - <copy file="${resources.dir}/META-INF/services/javax.persistence.spi.PersistenceProvider" todir="${classes.dir}/META-INF/services"/> + <copy todir="${classes.dir}"> + <fileset dir="${resources.dir}"> + <include name="**/*.*"/> + </fileset> + </copy> <manifest file="${classes.dir}/META-INF/MANIFEST.MF"> <attribute name="Product" value="${Name}"/> <attribute name="Version" value="${version}"/> Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-15 01:00:50 UTC (rev 9623) @@ -147,7 +147,11 @@ while ( xmls.hasMoreElements() ) { URL url = xmls.nextElement(); log.trace( "Analyse of persistence.xml: " + url ); - List<PersistenceMetadata> metadataFiles = PersistenceXmlLoader.deploy( url, integration ); + List<PersistenceMetadata> metadataFiles = PersistenceXmlLoader.deploy( + url, + integration, + cfg.getEntityResolver() + ); for ( PersistenceMetadata metadata : metadataFiles ) { JarVisitor.Filter[] filters = getFilters( metadata.getProps(), integration ); 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-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java 2006-03-15 01:00:50 UTC (rev 9623) @@ -6,8 +6,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; -import java.util.Properties; import javax.persistence.PersistenceException; import javax.persistence.spi.PersistenceUnitTransactionType; import javax.xml.parsers.DocumentBuilder; @@ -21,13 +21,16 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import org.xml.sax.EntityResolver; +import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; +import org.xml.sax.SAXParseException; /** - * Comment + * Persistence.xml handler * * @author <a href="mailto:bi...@jb...">Bill Burke</a> - * @version $Revision$ + * @author Emmanuel Bernard */ public final class PersistenceXmlLoader { private static Log log = LogFactory.getLog( PersistenceXmlLoader.class ); @@ -35,28 +38,38 @@ private PersistenceXmlLoader() { } - private static Document loadURL(URL configURL) throws Exception { + private static Document loadURL(URL configURL, EntityResolver resolver) throws Exception { InputStream is = configURL != null ? configURL.openStream() : null; if ( is == null ) { throw new IOException( "Failed to obtain InputStream from url: " + configURL ); } - + List errors = new ArrayList(); DocumentBuilderFactory docBuilderFactory = null; docBuilderFactory = DocumentBuilderFactory.newInstance(); - docBuilderFactory.setValidating( false ); + docBuilderFactory.setValidating( true ); + docBuilderFactory.setNamespaceAware( true ); + try { + //otherwise Xerces fails in validation + docBuilderFactory.setAttribute( "http://apache.org/xml/features/validation/schema", true); + } + catch (IllegalArgumentException e) { + docBuilderFactory.setValidating( false ); + docBuilderFactory.setNamespaceAware( false ); + } InputSource source = new InputSource( is ); - //URL url = AspectXmlLoader.class.getResource("/jboss-aop_1_0.dtd"); - //source.setSystemId( url.toString() ); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); - //docBuilder.setEntityResolver( new AspectXmlLoader.Resolver() ); - //docBuilder.setErrorHandler( new LocalErrorHandler() ); + docBuilder.setEntityResolver( resolver ); + docBuilder.setErrorHandler( new ErrorLogger("XML InputStream", errors) ); Document doc = docBuilder.parse( source ); + if ( errors.size() != 0 ) { + throw new PersistenceException( "invalid persistence.xml", (Throwable) errors.get( 0 ) ); + } return doc; } - public static List<PersistenceMetadata> deploy(URL url, Map overrides) throws Exception { + public static List<PersistenceMetadata> deploy(URL url, Map overrides, EntityResolver resolver) throws Exception { - Document doc = loadURL( url ); + Document doc = loadURL( url, resolver ); Element top = doc.getDocumentElement(); NodeList children = top.getChildNodes(); ArrayList<PersistenceMetadata> units = new ArrayList<PersistenceMetadata>(); @@ -97,7 +110,7 @@ return units; } - public static PersistenceMetadata parsePersistenceUnit(Element top) + private static PersistenceMetadata parsePersistenceUnit(Element top) throws Exception { PersistenceMetadata metadata = new PersistenceMetadata(); String puName = top.getAttribute( "name" ); @@ -168,4 +181,23 @@ else throw new PersistenceException("Unknown TransactionType: " + elementContent); } + public static class ErrorLogger implements ErrorHandler { + private String file; + private List errors; + ErrorLogger(String file, List errors) { + this.file=file; + this.errors = errors; + } + public void error(SAXParseException error) { + log.error( "Error parsing XML: " + file + '(' + error.getLineNumber() + ") " + error.getMessage() ); + errors.add(error); + } + public void fatalError(SAXParseException error) { + error(error); + } + public void warning(SAXParseException warn) { + log.warn( "Warning parsing XML: " + file + '(' + warn.getLineNumber() + ") " + warn.getMessage() ); + } + } + } Modified: trunk/HibernateExt/ejb/src/test-resources/cfgxmlpar/META-INF/persistence.xml =================================================================== --- trunk/HibernateExt/ejb/src/test-resources/cfgxmlpar/META-INF/persistence.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/test-resources/cfgxmlpar/META-INF/persistence.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -1,6 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- example of reference to a cfg.xml file --> -<persistence> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" + version="1.0"> <persistence-unit name="cfgxmlpar" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> Modified: trunk/HibernateExt/ejb/src/test-resources/defaultpar/META-INF/persistence.xml =================================================================== --- trunk/HibernateExt/ejb/src/test-resources/defaultpar/META-INF/persistence.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/test-resources/defaultpar/META-INF/persistence.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- example of a default persistence.xml --> -<persistence> - <persistence-unit transaction-type="RESOURCE_LOCAL"> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" + version="1.0"> + <persistence-unit name="defaultpar" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> Modified: trunk/HibernateExt/ejb/src/test-resources/excludehbmpar/META-INF/persistence.xml =================================================================== --- trunk/HibernateExt/ejb/src/test-resources/excludehbmpar/META-INF/persistence.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/test-resources/excludehbmpar/META-INF/persistence.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- example of a default persistence.xml --> -<persistence> - <persistence-unit transaction-type="RESOURCE_LOCAL"> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" + version="1.0"> + <persistence-unit name="excludehbmpar" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> Modified: trunk/HibernateExt/ejb/src/test-resources/explicitpar/META-INF/persistence.xml =================================================================== --- trunk/HibernateExt/ejb/src/test-resources/explicitpar/META-INF/persistence.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/test-resources/explicitpar/META-INF/persistence.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -1,11 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> -<persistence> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" + version="1.0"> <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL"> + <jar-file>./build/testresources/externaljar.jar</jar-file> <class>org.hibernate.ejb.test.Cat</class> <class>org.hibernate.ejb.test.Distributor</class> <class>org.hibernate.ejb.test.Item</class> <class>org.hibernate.ejb.test</class> - <jar-file>./build/testresources/externaljar.jar</jar-file> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> @@ -20,8 +23,9 @@ <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.generate_statistics" value="true"/> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> - <property name="hibernate.ejb.naming_strategy">org.hibernate.ejb.test.MyNamingStrategy</property> + <property name="hibernate.ejb.naming_strategy" value="org.hibernate.ejb.test.MyNamingStrategy"/> <!-- test naming strategy and fall back to element content --> + <!-- property name="hibernate.ejb.naming_strategy">org.hibernate.ejb.test.MyNamingStrategy</property --> <!-- cache configuration --> <property name="hibernate.ejb.classcache.org.hibernate.ejb.test.Item" value="read-write"/> Modified: trunk/HibernateExt/ejb/src/test-resources/explodedpar/META-INF/persistence.xml =================================================================== --- trunk/HibernateExt/ejb/src/test-resources/explodedpar/META-INF/persistence.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/test-resources/explodedpar/META-INF/persistence.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -1,7 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- example of a default persistence.xml --> -<persistence> - <persistence-unit transaction-type="RESOURCE_LOCAL"> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" + version="1.0"> + <persistence-unit name="explodedpar" transaction-type="RESOURCE_LOCAL"> + <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java 2006-03-15 01:00:50 UTC (rev 9623) @@ -15,16 +15,14 @@ public class EJB3DTDEntityResolver extends DTDEntityResolver { public static final EntityResolver INSTANCE = new EJB3DTDEntityResolver(); - private static final Log log = LogFactory.getLog( DTDEntityResolver.class ); + private static final Log log = LogFactory.getLog( EJB3DTDEntityResolver.class ); - private static final String EJB3ORM_NAMESPACE = "http://java.sun.com/xml/ns/persistence/orm"; - public InputSource resolveEntity(String publicId, String systemId) { InputSource is = super.resolveEntity( publicId, systemId ); if (is == null) { if ( systemId != null ) { if ( systemId.endsWith( "orm_1_0.xsd" ) ) { - log.debug( "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/" ); + log.debug( "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/ejb" ); String path = "org/hibernate/ejb/" + "orm_1_0.xsd"; InputStream dtdStream = resolveInHibernateNamespace( path ); if ( dtdStream == null ) { @@ -38,6 +36,21 @@ return source; } } + else if ( systemId.endsWith( "persistence_1_0.xsd" ) ) { + log.debug( "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/ejb" ); + String path = "org/hibernate/ejb/" + "persistence_1_0.xsd"; + InputStream dtdStream = resolveInHibernateNamespace( path ); + if ( dtdStream == null ) { + log.debug( "unable to locate [" + systemId + "] on classpath" ); + } + else { + log.debug( "located [" + systemId + "] in classpath" ); + InputSource source = new InputSource( dtdStream ); + source.setPublicId( publicId ); + source.setSystemId( systemId ); + return source; + } + } } } else { |
From: <hib...@li...> - 2006-03-15 00:24:26
|
Author: bi...@jb... Date: 2006-03-14 19:24:08 -0500 (Tue, 14 Mar 2006) New Revision: 9622 Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java Log: update api Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java 2006-03-15 00:21:49 UTC (rev 9621) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java 2006-03-15 00:24:08 UTC (rev 9622) @@ -224,7 +224,15 @@ */ public void joinTransaction(); - /** + /** + * Return the underlying provider object for the EntityManager, if available. + * The result of this method is implementation specific + * + * @return + */ + public Object getDelegate(); + + /** * Close an application-managed EntityManager. * After the close method has been invoked, all methods * on the EntityManager instance and any Query objects obtained |
Author: ste...@jb... Date: 2006-03-14 19:21:49 -0500 (Tue, 14 Mar 2006) New Revision: 9621 Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java Removed: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/CompositeIdTest.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/PropertyRefTest.java Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/AllTests.java Log: HHH-535 : AllTests Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/AllTests.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-15 00:21:05 UTC (rev 9620) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-15 00:21:49 UTC (rev 9621) @@ -126,6 +126,8 @@ import org.hibernate.test.version.db.DbVersionTest; import org.hibernate.test.version.sybase.SybaseTimestampVersioningTest; import org.hibernate.test.where.WhereTest; +import org.hibernate.test.abstractembeddedcomponents.propertyref.AbstractComponentPropertyRefTest; +import org.hibernate.test.abstractembeddedcomponents.cid.AbstractCompositeIdTest; import org.hibernate.dialect.Dialect; /** @@ -327,6 +329,9 @@ suite.addTest( OracleGeneratedKeysTest.suite() ); suite.addTest( InterceptorDynamicEntityTest.suite() ); suite.addTest( TuplizerDynamicEntityTest.suite() ); + suite.addTest( AbstractComponentPropertyRefTest.suite() ); + suite.addTest( AbstractCompositeIdTest.suite() ); + return filter( suite ); //return suite; } Copied: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java (from rev 9617, branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/CompositeIdTest.java) =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/CompositeIdTest.java 2006-03-14 23:47:37 UTC (rev 9617) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java 2006-03-15 00:21:49 UTC (rev 9621) @@ -0,0 +1,43 @@ +package org.hibernate.test.abstractembeddedcomponents.cid; + +import org.hibernate.test.TestCase; +import org.hibernate.Session; +import org.hibernate.Transaction; +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * @author Steve Ebersole + */ +public class AbstractCompositeIdTest extends TestCase { + public AbstractCompositeIdTest(String x) { + super( x ); + } + + public static Test suite() { + return new TestSuite( AbstractCompositeIdTest.class ); + } + + protected String[] getMappings() { + return new String[] { "abstractembeddedcomponents/cid/Mappings.hbm.xml" }; + } + + public void testEmbeddedCompositeIdentifierOnAbstractClass() { + MyInterfaceImpl myInterface = new MyInterfaceImpl(); + myInterface.setKey1( "key1" ); + myInterface.setKey2( "key2" ); + myInterface.setName( "test" ); + + Session s = openSession(); + Transaction t = s.beginTransaction(); + s.save( myInterface ); + s.flush(); + + s.createQuery( "from MyInterface" ).list(); + + s.delete( myInterface ); + t.commit(); + s.close(); + + } +} Deleted: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/CompositeIdTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/CompositeIdTest.java 2006-03-15 00:21:05 UTC (rev 9620) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/CompositeIdTest.java 2006-03-15 00:21:49 UTC (rev 9621) @@ -1,37 +0,0 @@ -package org.hibernate.test.abstractembeddedcomponents.cid; - -import org.hibernate.test.TestCase; -import org.hibernate.Session; -import org.hibernate.Transaction; - -/** - * @author Steve Ebersole - */ -public class CompositeIdTest extends TestCase { - public CompositeIdTest(String x) { - super( x ); - } - - protected String[] getMappings() { - return new String[] { "abstractembeddedcomponents/cid/Mappings.hbm.xml" }; - } - - public void testEmbeddedCompositeIdentifierOnAbstractClass() { - MyInterfaceImpl myInterface = new MyInterfaceImpl(); - myInterface.setKey1( "key1" ); - myInterface.setKey2( "key2" ); - myInterface.setName( "test" ); - - Session s = openSession(); - Transaction t = s.beginTransaction(); - s.save( myInterface ); - s.flush(); - - s.createQuery( "from MyInterface" ).list(); - - s.delete( myInterface ); - t.commit(); - s.close(); - - } -} Copied: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java (from rev 9617, branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/PropertyRefTest.java) =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/PropertyRefTest.java 2006-03-14 23:47:37 UTC (rev 9617) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java 2006-03-15 00:21:49 UTC (rev 9621) @@ -0,0 +1,53 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +import org.hibernate.test.TestCase; +import org.hibernate.Session; +import org.hibernate.Transaction; +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * Test of property-refs pointing to abstract embedded components; i.e. + * a mapping properties element (which is internally handled as an embedded + * component) defined on an abstract class or interface which is a target of + * a property-ref mapping. + * + * @author Steve Ebersole + */ +public class AbstractComponentPropertyRefTest extends TestCase { + public AbstractComponentPropertyRefTest(String x) { + super( x ); + } + + public static Test suite() { + return new TestSuite( AbstractComponentPropertyRefTest.class ); + } + + protected String[] getMappings() { + return new String[] { "abstractembeddedcomponents/propertyref/Mappings.hbm.xml" }; + } + + public void testPropertiesRefCascades() { + Session session = openSession(); + Transaction trans = session.beginTransaction(); + ServerImpl server = new ServerImpl(); + session.save( server ); + AddressImpl address = new AddressImpl(); + server.setAddress( address ); + address.setServer( server ); + session.flush(); + session.createQuery( "from Server s join fetch s.address" ).list(); + trans.commit(); + session.close(); + + assertNotNull( server.getId() ); + assertNotNull( address.getId() ); + + session = openSession(); + trans = session.beginTransaction(); + session.delete( address ); + session.delete( server ); + trans.commit(); + session.close(); + } +} Deleted: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/PropertyRefTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/PropertyRefTest.java 2006-03-15 00:21:05 UTC (rev 9620) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/PropertyRefTest.java 2006-03-15 00:21:49 UTC (rev 9621) @@ -1,47 +0,0 @@ -package org.hibernate.test.abstractembeddedcomponents.propertyref; - -import org.hibernate.test.TestCase; -import org.hibernate.Session; -import org.hibernate.Transaction; - -/** - * Test of property-refs pointing to abstract embedded components; i.e. - * a mapping properties element (which is internally handled as an embedded - * component) defined on an abstract class or interface which is a target of - * a property-ref mapping. - * - * @author Steve Ebersole - */ -public class PropertyRefTest extends TestCase { - public PropertyRefTest(String x) { - super( x ); - } - - protected String[] getMappings() { - return new String[] { "abstractembeddedcomponents/propertyref/Mappings.hbm.xml" }; - } - - public void testPropertiesRefCascades() { - Session session = openSession(); - Transaction trans = session.beginTransaction(); - ServerImpl server = new ServerImpl(); - session.save( server ); - AddressImpl address = new AddressImpl(); - server.setAddress( address ); - address.setServer( server ); - session.flush(); - session.createQuery( "from Server s join fetch s.address" ).list(); - trans.commit(); - session.close(); - - assertNotNull( server.getId() ); - assertNotNull( address.getId() ); - - session = openSession(); - trans = session.beginTransaction(); - session.delete( address ); - session.delete( server ); - trans.commit(); - session.close(); - } -} |
Author: ste...@jb... Date: 2006-03-14 19:12:47 -0500 (Tue, 14 Mar 2006) New Revision: 9619 Added: trunk/Hibernate3/src/org/hibernate/bytecode/BasicProxyFactory.java trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java Modified: trunk/Hibernate3/src/org/hibernate/bytecode/BytecodeProvider.java trunk/Hibernate3/src/org/hibernate/bytecode/ProxyFactoryFactory.java trunk/Hibernate3/src/org/hibernate/bytecode/cglib/ProxyFactoryFactoryImpl.java trunk/Hibernate3/src/org/hibernate/bytecode/javassist/ProxyFactoryFactoryImpl.java trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java trunk/Hibernate3/src/org/hibernate/mapping/Component.java trunk/Hibernate3/src/org/hibernate/mapping/Index.java trunk/Hibernate3/src/org/hibernate/mapping/Table.java trunk/Hibernate3/src/org/hibernate/tuple/PojoComponentTuplizer.java trunk/Hibernate3/test/org/hibernate/test/AllTests.java Log: HHH-535 : embedded components (<composite-id/> and <properties/>) defined on non-concrete entities Added: trunk/Hibernate3/src/org/hibernate/bytecode/BasicProxyFactory.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/bytecode/BasicProxyFactory.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/src/org/hibernate/bytecode/BasicProxyFactory.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,10 @@ +package org.hibernate.bytecode; + +/** + * A proxy factory for "basic proxy" generation + * + * @author Steve Ebersole + */ +public interface BasicProxyFactory { + public Object getProxy(); +} Modified: trunk/Hibernate3/src/org/hibernate/bytecode/BytecodeProvider.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/bytecode/BytecodeProvider.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/src/org/hibernate/bytecode/BytecodeProvider.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -2,6 +2,15 @@ /** * Contract for providers of bytecode services to Hibernate. + * <p/> + * Bytecode requirements break down into basically 4 areas<ol> + * <li>proxy generation (both for runtime-lazy-loading and basic proxy generation) + * {@link #getProxyFactoryFactory()} + * <li>bean relection optimization {@link #getReflectionOptimizer} + * <li>build-time instumentation (not covered by this contract) + * <li>class-load intrumentation {@link #generateDynamicFieldInterceptionClassLoader}; + * (currently only used in the test suite). + * </ol> * * @author Steve Ebersole */ Modified: trunk/Hibernate3/src/org/hibernate/bytecode/ProxyFactoryFactory.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/bytecode/ProxyFactoryFactory.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/src/org/hibernate/bytecode/ProxyFactoryFactory.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -11,5 +11,27 @@ * @author Steve Ebersole */ public interface ProxyFactoryFactory { + /** + * Build a proxy factory specifically for handling runtime + * lazy loading. + * + * @return The lazy-load proxy factory. + */ public ProxyFactory buildProxyFactory(); + + /** + * Build a proxy factory for basic proxy concerns. The return + * should be capable of properly handling newInstance() calls. + * <p/> + * Should build basic proxies essentially equivalent to JDK proxies in + * terms of capabilities, but should be able to deal with abstract super + * classes in addition to proxy interfaces. + * <p/> + * Must pass in either superClass or interfaces (or both). + * + * @param superClass The abstract super class (or null if none). + * @param interfaces Interfaces to be proxied (or null if none). + * @return The proxy class + */ + public BasicProxyFactory buildBasicProxyFactory(Class superClass, Class[] interfaces); } Modified: trunk/Hibernate3/src/org/hibernate/bytecode/cglib/ProxyFactoryFactoryImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/bytecode/cglib/ProxyFactoryFactoryImpl.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/src/org/hibernate/bytecode/cglib/ProxyFactoryFactoryImpl.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -1,15 +1,29 @@ package org.hibernate.bytecode.cglib; import org.hibernate.bytecode.ProxyFactoryFactory; +import org.hibernate.bytecode.BasicProxyFactory; import org.hibernate.proxy.ProxyFactory; import org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory; +import org.hibernate.AssertionFailure; +import org.hibernate.HibernateException; +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.CallbackFilter; +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; +import net.sf.cglib.proxy.NoOp; +import net.sf.cglib.proxy.Callback; +import net.sf.cglib.proxy.Factory; +import java.lang.reflect.Method; +import java.util.HashMap; + /** * A factory for CGLIB-based {@link ProxyFactory} instances. * * @author Steve Ebersole */ public class ProxyFactoryFactoryImpl implements ProxyFactoryFactory { + /** * Builds a CGLIB-based proxy factory. * @@ -18,4 +32,110 @@ public ProxyFactory buildProxyFactory() { return new CGLIBProxyFactory(); } + + public BasicProxyFactory buildBasicProxyFactory(Class superClass, Class[] interfaces) { + return new BasicProxyFactoryImpl( superClass, interfaces ); + } + + public static class BasicProxyFactoryImpl implements BasicProxyFactory { + private final Class proxyClass; + private final Factory factory; + + public BasicProxyFactoryImpl(Class superClass, Class[] interfaces) { + if ( superClass == null && ( interfaces == null || interfaces.length < 1 ) ) { + throw new AssertionFailure( "attempting to build proxy without any superclass or interfaces" ); + } + + Enhancer en = new Enhancer(); + en.setUseCache( false ); + en.setInterceptDuringConstruction( false ); + en.setUseFactory( true ); + en.setCallbackTypes( CALLBACK_TYPES ); + en.setCallbackFilter( FINALIZE_FILTER ); + if ( superClass != null ) { + en.setSuperclass( superClass ); + } + if ( interfaces != null && interfaces.length > 0 ) { + en.setInterfaces( interfaces ); + } + proxyClass = en.createClass(); + try { + factory = ( Factory ) proxyClass.newInstance(); + } + catch ( Throwable t ) { + throw new HibernateException( "Unable to build CGLIB Factory instance" ); + } + } + + public Object getProxy() { + try { + return factory.newInstance( + new Callback[] { new PassThroughInterceptor( proxyClass.getName() ), NoOp.INSTANCE } + ); + } + catch ( Throwable t ) { + throw new HibernateException( "Unable to instantiate proxy instance" ); + } + } + } + + private static final CallbackFilter FINALIZE_FILTER = new CallbackFilter() { + public int accept(Method method) { + if ( method.getParameterTypes().length == 0 && method.getName().equals("finalize") ){ + return 1; + } + else { + return 0; + } + } + }; + + private static final Class[] CALLBACK_TYPES = new Class[] { MethodInterceptor.class, NoOp.class }; + + private static class PassThroughInterceptor implements MethodInterceptor { + private HashMap data = new HashMap(); + private final String proxiedClassName; + + public PassThroughInterceptor(String proxiedClassName) { + this.proxiedClassName = proxiedClassName; + } + + public Object intercept( + Object obj, + Method method, + Object[] args, + MethodProxy proxy) throws Throwable { + String name = method.getName(); + if ( "toString".equals( name ) ) { + return proxiedClassName + "@" + System.identityHashCode( obj ); + } + else if ( "equals".equals( name ) ) { + return args[0] instanceof Factory && ( ( Factory ) args[0] ).getCallback( 0 ) == this + ? Boolean.TRUE + : Boolean.FALSE; + } + else if ( "hashCode".equals( name ) ) { + return new Integer( System.identityHashCode( obj ) ); + } + boolean hasGetterSignature = method.getParameterTypes().length == 0 && method.getReturnType() != null; + boolean hasSetterSignature = method.getParameterTypes().length == 1 && ( method.getReturnType() == null || method.getReturnType() == void.class ); + if ( name.startsWith( "get" ) && hasGetterSignature ) { + String propName = name.substring( 3 ); + return data.get( propName ); + } + else if ( name.startsWith( "is" ) && hasGetterSignature ) { + String propName = name.substring( 2 ); + return data.get( propName ); + } + else if ( name.startsWith( "set" ) && hasSetterSignature) { + String propName = name.substring( 3 ); + data.put( propName, args[0] ); + return null; + } + else { + // todo : what else to do here? + return null; + } + } + } } Modified: trunk/Hibernate3/src/org/hibernate/bytecode/javassist/ProxyFactoryFactoryImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/bytecode/javassist/ProxyFactoryFactoryImpl.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/src/org/hibernate/bytecode/javassist/ProxyFactoryFactoryImpl.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -1,15 +1,25 @@ package org.hibernate.bytecode.javassist; import org.hibernate.bytecode.ProxyFactoryFactory; +import org.hibernate.bytecode.BasicProxyFactory; import org.hibernate.proxy.ProxyFactory; import org.hibernate.proxy.pojo.javassist.JavassistProxyFactory; +import org.hibernate.AssertionFailure; +import org.hibernate.HibernateException; +import javassist.util.proxy.MethodFilter; +import javassist.util.proxy.ProxyObject; +import javassist.util.proxy.MethodHandler; +import java.lang.reflect.Method; +import java.util.HashMap; + /** * A factory for Javassist-based {@link ProxyFactory} instances. * * @author Steve Ebersole */ public class ProxyFactoryFactoryImpl implements ProxyFactoryFactory { + /** * Builds a Javassist-based proxy factory. * @@ -18,4 +28,96 @@ public ProxyFactory buildProxyFactory() { return new JavassistProxyFactory(); } + + public BasicProxyFactory buildBasicProxyFactory(Class superClass, Class[] interfaces) { + return new BasicProxyFactoryImpl( superClass, interfaces ); + } + + private static class BasicProxyFactoryImpl implements BasicProxyFactory { + private final Class proxyClass; + + public BasicProxyFactoryImpl(Class superClass, Class[] interfaces) { + if ( superClass == null && ( interfaces == null || interfaces.length < 1 ) ) { + throw new AssertionFailure( "attempting to build proxy without any superclass or interfaces" ); + } + javassist.util.proxy.ProxyFactory factory = new javassist.util.proxy.ProxyFactory(); + factory.setFilter( FINALIZE_FILTER ); + if ( superClass != null ) { + factory.setSuperclass( superClass ); + } + if ( interfaces != null && interfaces.length > 0 ) { + factory.setInterfaces( interfaces ); + } + proxyClass = factory.createClass(); + } + + public Object getProxy() { + try { + ProxyObject proxy = ( ProxyObject ) proxyClass.newInstance(); + proxy.setHandler( new PassThroughHandler( proxy, proxyClass.getName() ) ); + return proxy; + } + catch ( Throwable t ) { + throw new HibernateException( "Unable to instantiated proxy instance" ); + } + } + + public boolean isInstance(Object object) { + return proxyClass.isInstance( object ); + } + } + + private static final MethodFilter FINALIZE_FILTER = new MethodFilter() { + public boolean isHandled(Method m) { + // skip finalize methods + return !( m.getParameterTypes().length == 0 && m.getName().equals( "finalize" ) ); + } + }; + + private static class PassThroughHandler implements MethodHandler { + private HashMap data = new HashMap(); + private final Object proxiedObject; + private final String proxiedClassName; + + public PassThroughHandler(Object proxiedObject, String proxiedClassName) { + this.proxiedObject = proxiedObject; + this.proxiedClassName = proxiedClassName; + } + + public Object invoke( + Object object, + Method method, + Method method1, + Object[] args) throws Exception { + String name = method.getName(); + if ( "toString".equals( name ) ) { + return proxiedClassName + "@" + System.identityHashCode( object ); + } + else if ( "equals".equals( name ) ) { + return proxiedObject == object ? Boolean.TRUE : Boolean.FALSE; + } + else if ( "hashCode".equals( name ) ) { + return new Integer( System.identityHashCode( object ) ); + } + boolean hasGetterSignature = method.getParameterTypes().length == 0 && method.getReturnType() != null; + boolean hasSetterSignature = method.getParameterTypes().length == 1 && ( method.getReturnType() == null || method.getReturnType() == void.class ); + if ( name.startsWith( "get" ) && hasGetterSignature ) { + String propName = name.substring( 3 ); + return data.get( propName ); + } + else if ( name.startsWith( "is" ) && hasGetterSignature ) { + String propName = name.substring( 2 ); + return data.get( propName ); + } + else if ( name.startsWith( "set" ) && hasSetterSignature) { + String propName = name.substring( 3 ); + data.put( propName, args[0] ); + return null; + } + else { + // todo : what else to do here? + return null; + } + } + } } Modified: trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -1906,7 +1906,7 @@ return this; } - private Mapping buildMapping() { + public Mapping buildMapping() { return new Mapping() { /** * Returns the identifier type of a mapped class Modified: trunk/Hibernate3/src/org/hibernate/mapping/Component.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/mapping/Component.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/src/org/hibernate/mapping/Component.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -138,7 +138,17 @@ this.dynamic = dynamic; } + private Type type; + public Type getType() throws MappingException { + // added this caching as I noticed that getType() is being called multiple times... + if ( type == null ) { + type = buildType(); + } + return type; + } + + private Type buildType() { final int span = getPropertySpan(); String[] names = new String[span]; org.hibernate.type.Type[] types = new org.hibernate.type.Type[span]; Modified: trunk/Hibernate3/src/org/hibernate/mapping/Index.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/mapping/Index.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/src/org/hibernate/mapping/Index.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -57,7 +57,7 @@ String defaultSchema ) { StringBuffer buf = new StringBuffer("create") - .append( unique ? " unique " : "") + .append( unique ? " unique" : "") .append(" index ") .append( dialect.qualifyIndexName() ? name : StringHelper.unqualify(name) ) .append(" on ") Modified: trunk/Hibernate3/src/org/hibernate/mapping/Table.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/mapping/Table.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/src/org/hibernate/mapping/Table.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -86,7 +86,9 @@ } public String getQualifiedName(Dialect dialect, String defaultCatalog, String defaultSchema) { - if ( subselect != null ) return "( " + subselect + " )"; + if ( subselect != null ) { + return "( " + subselect + " )"; + } String quotedName = getQuotedName(dialect); String usedSchema = schema == null ? defaultSchema : getQuotedSchema(dialect); String usedCatalog = catalog == null ? defaultCatalog : catalog; @@ -151,7 +153,9 @@ * @return the underlying column or null if not inside this table. Note: the instance *can* be different than the input parameter, but the name will be the same. */ public Column getColumn(Column column) { - if (column == null) return null; + if ( column == null ) { + return null; + } Column myColumn = ( Column ) columns.get( column.getCanonicalName() ); @@ -162,7 +166,9 @@ public Column getColumn(int n) { Iterator iter = columns.values().iterator(); - for ( int i = 0; i < n - 1; i++ ) iter.next(); + for ( int i = 0; i < n - 1; i++ ) { + iter.next(); + } return ( Column ) iter.next(); } @@ -276,7 +282,9 @@ } String columnComment = column.getComment(); - if (columnComment!=null) alter.append( dialect.getColumnComment(columnComment) ); + if ( columnComment != null ) { + alter.append( dialect.getColumnComment( columnComment ) ); + } results.add( alter.toString() ); } @@ -385,7 +393,9 @@ buf.append( dialect.getColumnComment(columnComment) ); } - if ( iter.hasNext() ) buf.append( ", " ); + if ( iter.hasNext() ) { + buf.append( ", " ); + } } if ( hasPrimaryKey() ) { @@ -417,18 +427,24 @@ } buf.append( ')' ); + + if ( comment != null ) { + buf.append( dialect.getTableComment( comment ) ); + } - if (comment!=null) buf.append( dialect.getTableComment(comment) ); - return buf.append( dialect.getTableTypeString() ).toString(); } public String sqlDropString(Dialect dialect, String defaultCatalog, String defaultSchema) { StringBuffer buf = new StringBuffer( "drop table " ); - if ( dialect.supportsIfExistsBeforeTableName() ) buf.append( "if exists " ); + if ( dialect.supportsIfExistsBeforeTableName() ) { + buf.append( "if exists " ); + } buf.append( getQualifiedName( dialect , defaultCatalog, defaultSchema ) ) .append( dialect.getCascadeConstraintsString() ); - if ( dialect.supportsIfExistsAfterTableName() ) buf.append( " if exists" ); + if ( dialect.supportsIfExistsAfterTableName() ) { + buf.append( " if exists" ); + } return buf.toString(); } @@ -524,10 +540,14 @@ foreignKeys.put( key, fk ); fk.setReferencedEntityName( referencedEntityName ); fk.addColumns( keyColumns.iterator() ); - if(referencedColumns!=null) fk.addReferencedColumns( referencedColumns.iterator() ); + if ( referencedColumns != null ) { + fk.addReferencedColumns( referencedColumns.iterator() ); + } } - if ( keyName != null ) fk.setName( keyName ); + if ( keyName != null ) { + fk.setName( keyName ); + } return fk; } @@ -538,8 +558,12 @@ public String uniqueColumnString(Iterator iterator, String referencedEntityName) { int result = 0; - if (referencedEntityName!=null) result += referencedEntityName.hashCode(); - while ( iterator.hasNext() ) result += iterator.next().hashCode(); + if ( referencedEntityName != null ) { + result += referencedEntityName.hashCode(); + } + while ( iterator.hasNext() ) { + result += iterator.next().hashCode(); + } return ( Integer.toHexString( name.hashCode() ) + Integer.toHexString( result ) ).toUpperCase(); } @@ -574,6 +598,10 @@ this.idValue = idValue; } + public KeyValue getIdentifierValue() { + return idValue; + } + public boolean isSchemaQuoted() { return schemaQuoted; } @@ -605,8 +633,12 @@ public String toString() { StringBuffer buf = new StringBuffer().append( getClass().getName() ) .append('('); - if ( getCatalog()!=null ) buf.append( getCatalog() + "." ); - if ( getSchema()!=null ) buf.append( getSchema()+ "."); + if ( getCatalog() != null ) { + buf.append( getCatalog() + "." ); + } + if ( getSchema() != null ) { + buf.append( getSchema() + "." ); + } buf.append( getName() ).append(')'); return buf.toString(); } @@ -654,7 +686,11 @@ public void setComment(String comment) { this.comment = comment; } - + + public Iterator getCheckConstraintsIterator() { + return checkConstraints.iterator(); + } + public Iterator sqlCommentStrings(Dialect dialect, String defaultCatalog, String defaultSchema) { List comments = new ArrayList(); if ( dialect.supportsCommentOn() ) { Modified: trunk/Hibernate3/src/org/hibernate/tuple/PojoComponentTuplizer.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/tuple/PojoComponentTuplizer.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/src/org/hibernate/tuple/PojoComponentTuplizer.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -2,9 +2,13 @@ package org.hibernate.tuple; import java.lang.reflect.Method; +import java.io.Serializable; import org.hibernate.HibernateException; +import org.hibernate.AssertionFailure; +import org.hibernate.util.ReflectHelper; import org.hibernate.bytecode.ReflectionOptimizer; +import org.hibernate.bytecode.BasicProxyFactory; import org.hibernate.cfg.Environment; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.mapping.Component; @@ -18,7 +22,7 @@ * @author Gavin King */ public class PojoComponentTuplizer extends AbstractComponentTuplizer { - + private final Class componentClass; private ReflectionOptimizer optimizer; private final Getter parentGetter; @@ -63,7 +67,7 @@ public Class getMappedClass() { return componentClass; } - + public Object[] getPropertyValues(Object component) throws HibernateException { if ( optimizer != null && optimizer.getAccessOptimizer() != null ) { return optimizer.getAccessOptimizer().getPropertyValues( component ); @@ -82,15 +86,15 @@ } } - + public Object getParent(Object component) { return parentGetter.get( component ); } - + public boolean hasParentProperty() { return parentGetter!=null; } - + public boolean isMethodOf(Method method) { for ( int i=0; i<propertySpan; i++ ) { final Method getterMethod = getters[i].getMethod(); @@ -98,12 +102,15 @@ } return false; } - + public void setParent(Object component, Object parent, SessionFactoryImplementor factory) { parentSetter.set(component, parent, factory); } - + protected Instantiator buildInstantiator(Component component) { + if ( component.isEmbedded() && ReflectHelper.isAbstractClass( component.getComponentClass() ) ) { + return new ProxiedInstantiator( component ); + } if ( optimizer == null ) { return new PojoInstantiator( component, null ); } @@ -120,4 +127,34 @@ return prop.getSetter( component.getComponentClass() ); } + private static class ProxiedInstantiator implements Instantiator { + private final Class proxiedClass; + private final BasicProxyFactory factory; + + public ProxiedInstantiator(Component component) { + proxiedClass = component.getComponentClass(); + if ( proxiedClass.isInterface() ) { + factory = Environment.getBytecodeProvider() + .getProxyFactoryFactory() + .buildBasicProxyFactory( null, new Class[] { proxiedClass } ); + } + else { + factory = Environment.getBytecodeProvider() + .getProxyFactoryFactory() + .buildBasicProxyFactory( proxiedClass, null ); + } + } + + public Object instantiate(Serializable id) { + throw new AssertionFailure( "ProxiedInstantiator can only be used to instantiate component" ); + } + + public Object instantiate() { + return factory.getProxy(); + } + + public boolean isInstance(Object object) { + return proxiedClass.isInstance( object ); + } + } } Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -128,6 +128,8 @@ import org.hibernate.test.version.sybase.SybaseTimestampVersioningTest; import org.hibernate.test.where.WhereTest; import org.hibernate.test.ejb3.EJB3Suite; +import org.hibernate.test.abstractembeddedcomponents.propertyref.AbstractComponentPropertyRefTest; +import org.hibernate.test.abstractembeddedcomponents.cid.AbstractCompositeIdTest; import org.hibernate.dialect.Dialect; /** @@ -288,6 +290,8 @@ suite.addTest( org.hibernate.test.bytecode.cglib.ReflectionOptimizerTest.suite() ); suite.addTest( org.hibernate.test.bytecode.javassist.ReflectionOptimizerTest.suite() ); suite.addTest( EJB3Suite.suite() ); + suite.addTest( AbstractComponentPropertyRefTest.suite() ); + suite.addTest( AbstractCompositeIdTest.suite() ); return filter( suite ); //return suite; Added: trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,43 @@ +package org.hibernate.test.abstractembeddedcomponents.cid; + +import org.hibernate.test.TestCase; +import org.hibernate.Session; +import org.hibernate.Transaction; +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * @author Steve Ebersole + */ +public class AbstractCompositeIdTest extends TestCase { + public AbstractCompositeIdTest(String x) { + super( x ); + } + + public static Test suite() { + return new TestSuite( AbstractCompositeIdTest.class ); + } + + protected String[] getMappings() { + return new String[] { "abstractembeddedcomponents/cid/Mappings.hbm.xml" }; + } + + public void testEmbeddedCompositeIdentifierOnAbstractClass() { + MyInterfaceImpl myInterface = new MyInterfaceImpl(); + myInterface.setKey1( "key1" ); + myInterface.setKey2( "key2" ); + myInterface.setName( "test" ); + + Session s = openSession(); + Transaction t = s.beginTransaction(); + s.save( myInterface ); + s.flush(); + + s.createQuery( "from MyInterface" ).list(); + + s.delete( myInterface ); + t.commit(); + s.close(); + + } +} Added: trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!DOCTYPE hibernate-mapping PUBLIC + "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> + +<hibernate-mapping package="org.hibernate.test.abstractembeddedcomponents.cid"> + + <class name="MyInterface" table="MY_INTF" proxy="MyInterface"> + <composite-id> + <key-property name="key1" type="string"/> + <key-property name="key2" type="string"/> + </composite-id> + <discriminator column="TYPE" type="string" length="10"/> + <property name="name" type="string"/> + </class> + + <subclass name="MyInterfaceImpl" extends="MyInterface" discriminator-value="1" proxy="MyInterface"> + </subclass> + +</hibernate-mapping> Added: trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,15 @@ +package org.hibernate.test.abstractembeddedcomponents.cid; + +import java.io.Serializable; + +/** + * @author Steve Ebersole + */ +public interface MyInterface extends Serializable { + public String getKey1(); + public void setKey1(String key1); + public String getKey2(); + public void setKey2(String key2); + public String getName(); + public void setName(String name); +} Added: trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,36 @@ +package org.hibernate.test.abstractembeddedcomponents.cid; + +import org.hibernate.test.abstractembeddedcomponents.cid.MyInterface; + +/** + * @author Steve Ebersole + */ +public class MyInterfaceImpl implements MyInterface { + private String key1; + private String key2; + private String name; + + public String getKey1() { + return key1; + } + + public void setKey1(String key1) { + this.key1 = key1; + } + + public String getKey2() { + return key2; + } + + public void setKey2(String key2) { + this.key2 = key2; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} Added: trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,48 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +import org.hibernate.test.TestCase; +import org.hibernate.Session; +import org.hibernate.Transaction; +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * @author Steve Ebersole + */ +public class AbstractComponentPropertyRefTest extends TestCase { + public AbstractComponentPropertyRefTest(String name) { + super( name ); + } + + public static Test suite() { + return new TestSuite( AbstractComponentPropertyRefTest.class ); + } + + protected String[] getMappings() { + return new String[] { "abstractembeddedcomponents/propertyref/Mappings.hbm.xml" }; + } + + public void testPropertiesRefCascades() { + Session session = openSession(); + Transaction trans = session.beginTransaction(); + ServerImpl server = new ServerImpl(); + session.save( server ); + AddressImpl address = new AddressImpl(); + server.setAddress( address ); + address.setServer( server ); + session.flush(); + session.createQuery( "from Server s join fetch s.address" ).list(); + trans.commit(); + session.close(); + + assertNotNull( server.getId() ); + assertNotNull( address.getId() ); + + session = openSession(); + trans = session.beginTransaction(); + session.delete( address ); + session.delete( server ); + trans.commit(); + session.close(); + } +} Added: trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,13 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +/** + * @author Steve Ebersole + */ +public interface Address { + public Long getId(); + public void setId(Long id); + public String getAddressType(); + public void setAddressType(String addressType); + public Server getServer(); + public void setServer(Server server); +} Added: trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,36 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +import org.hibernate.test.abstractembeddedcomponents.propertyref.Address; + +/** + * @author Steve Ebersole + */ +public class AddressImpl implements Address { + private Long id; + private String addressType; + private Server server; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAddressType() { + return addressType; + } + + public void setAddressType(String addressType) { + this.addressType = addressType; + } + + public Server getServer() { + return server; + } + + public void setServer(Server server) { + this.server = server; + } +} Added: trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,43 @@ +<?xml version="1.0"?> +<!DOCTYPE hibernate-mapping PUBLIC + "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> + +<hibernate-mapping package="org.hibernate.test.abstractembeddedcomponents.propertyref"> + + <class name="Address" table="ADDRESS" proxy="Address"> + <id name="id" type="long" column="ADDRESS_ID"> + <generator class="native"/> + </id> + <discriminator column="ADDRESS_TYPE" type="string" length="30"/> + <properties name="uniqueAddress"> + <property name="addressType" column="ADDRESS_TYPE" type="string" insert="false" update="false" length="30"/> + <many-to-one name="server" column="SERVER_ID" class="Server" not-null="true"/> + </properties> + </class> + + <subclass name="AddressImpl" extends="Address" discriminator-value="2" proxy="Address"> + </subclass> + + <class name="Server" table="SERVER" proxy="Server"> + <id name="id" type="long" column="SERVER_ID"> + <generator class="native"/> + </id> + <discriminator column="SERVER_TYPE" type="string" length="10"/> + <property name="serverType" type="string" column="SERVER_TYPE" length="10" update="false" insert="false"/> + </class> + + <subclass name="ServerImpl" extends="Server" discriminator-value="1" proxy="Server"> + <many-to-one name="address" + class="AddressImpl" + property-ref="uniqueAddress" + cascade="all" + unique="true" + update="false" + insert="false"> + <column name="ADDRESS_TYPE"/> + <column name="SERVER_ID"/> + </many-to-one> + </subclass> + +</hibernate-mapping> Added: trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,15 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +import org.hibernate.test.abstractembeddedcomponents.propertyref.Address; + +/** + * @author Steve Ebersole + */ +public interface Server { + public Long getId(); + public void setId(Long id); + public String getServerType(); + public void setServerType(String serverType); + public Address getAddress(); + public void setAddress(Address address); +} Added: trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java 2006-03-14 23:55:14 UTC (rev 9618) +++ trunk/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java 2006-03-15 00:12:47 UTC (rev 9619) @@ -0,0 +1,37 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +import org.hibernate.test.abstractembeddedcomponents.propertyref.Address; +import org.hibernate.test.abstractembeddedcomponents.propertyref.Server; + +/** + * @author Steve Ebersole + */ +public class ServerImpl implements Server { + private Long id; + private String serverType; + private Address address; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getServerType() { + return serverType; + } + + public void setServerType(String serverType) { + this.serverType = serverType; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } +} |
From: <hib...@li...> - 2006-03-14 23:47:44
|
Author: ste...@jb... Date: 2006-03-14 18:47:37 -0500 (Tue, 14 Mar 2006) New Revision: 9617 Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/CompositeIdTest.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/PropertyRefTest.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/tuple/PojoComponentTuplizer.java Log: HHH-535 : embedded components (<composite-id/> and <properties/>) defined on non-concrete entities Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/tuple/PojoComponentTuplizer.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/tuple/PojoComponentTuplizer.java 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/tuple/PojoComponentTuplizer.java 2006-03-14 23:47:37 UTC (rev 9617) @@ -2,12 +2,22 @@ package org.hibernate.tuple; import java.lang.reflect.Method; +import java.io.Serializable; +import java.util.HashMap; import net.sf.cglib.beans.BulkBean; import net.sf.cglib.reflect.FastClass; +import net.sf.cglib.proxy.Factory; +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.CallbackFilter; +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.NoOp; +import net.sf.cglib.proxy.MethodProxy; +import net.sf.cglib.proxy.Callback; import org.hibernate.HibernateException; import org.hibernate.PropertyAccessException; +import org.hibernate.AssertionFailure; import org.hibernate.cfg.Environment; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.mapping.Component; @@ -133,7 +143,12 @@ } protected Instantiator buildInstantiator(Component component) { - return new PojoInstantiator( component, fastClass ); + if ( component.isEmbedded() && ReflectHelper.isAbstractClass( component.getComponentClass() ) ) { + return new ProxiedInstantiator( component ); + } + else { + return new PojoInstantiator( component, fastClass ); + } } protected Getter buildGetter(Component component, Property prop) { @@ -144,4 +159,119 @@ return prop.getSetter( component.getComponentClass() ); } + private static class ProxiedInstantiator implements Instantiator { + private final Class proxiedClass; + private final Class proxyClass; + private final Factory factory; + + public ProxiedInstantiator(Component component) { + proxiedClass = component.getComponentClass(); + proxyClass = buildProxyClass(); + factory = buildFactory(); + } + + public Object instantiate(Serializable id) { + throw new AssertionFailure( "ProxiedInstantiator can only be used to instantiate component" ); + } + + public Object instantiate() { + try { + return factory.newInstance( + new Callback[] { new PassThroughInterceptor( proxyClass.getName() ), NoOp.INSTANCE } + ); + } + catch ( Throwable t ) { + throw new HibernateException( "Unable to instantiate proxy instance" ); + } + } + + public boolean isInstance(Object object) { + return proxiedClass.isInstance( object ); + } + + private Class buildProxyClass() { + Enhancer en = new Enhancer(); + en.setUseCache( false ); + en.setInterceptDuringConstruction( false ); + en.setUseFactory( true ); + en.setCallbackTypes( CALLBACK_TYPES ); + en.setCallbackFilter( FINALIZE_FILTER ); + if ( proxiedClass.isInterface() ) { + en.setInterfaces( new Class[] { proxiedClass } ); + } + else { + en.setSuperclass( proxiedClass ); + } + return en.createClass(); + + } + private Factory buildFactory() { + try { + return ( Factory ) proxyClass.newInstance(); + } + catch ( Throwable t ) { + throw new HibernateException( "Unable to build CGLIB Factory instance" ); + } + } + } + + private static final CallbackFilter FINALIZE_FILTER = new CallbackFilter() { + public int accept(Method method) { + if ( method.getParameterTypes().length == 0 && method.getName().equals("finalize") ){ + return 1; + } + else { + return 0; + } + } + }; + + private static final Class[] CALLBACK_TYPES = new Class[] { MethodInterceptor.class, NoOp.class }; + + private static class PassThroughInterceptor implements MethodInterceptor { + private HashMap data = new HashMap(); + private final String proxiedClassName; + + public PassThroughInterceptor(String proxiedClassName) { + this.proxiedClassName = proxiedClassName; + } + + public Object intercept( + Object obj, + Method method, + Object[] args, + MethodProxy proxy) throws Throwable { + String name = method.getName(); + if ( "toString".equals( name ) ) { + return proxiedClassName + "@" + System.identityHashCode( obj ); + } + else if ( "equals".equals( name ) ) { + return args[0] instanceof Factory && ( ( Factory ) args[0] ).getCallback( 0 ) == this + ? Boolean.TRUE + : Boolean.FALSE; + } + else if ( "hashCode".equals( name ) ) { + return new Integer( System.identityHashCode( obj ) ); + } + boolean hasGetterSignature = method.getParameterTypes().length == 0 && method.getReturnType() != null; + boolean hasSetterSignature = method.getParameterTypes().length == 1 && ( method.getReturnType() == null || method.getReturnType() == void.class ); + if ( name.startsWith( "get" ) && hasGetterSignature ) { + String propName = name.substring( 3 ); + return data.get( propName ); + } + else if ( name.startsWith( "is" ) && hasGetterSignature ) { + String propName = name.substring( 2 ); + return data.get( propName ); + } + else if ( name.startsWith( "set" ) && hasSetterSignature) { + String propName = name.substring( 3 ); + data.put( propName, args[0] ); + return null; + } + else { + // todo : what else to do here? + return null; + } + } + } } Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/CompositeIdTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/CompositeIdTest.java 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/CompositeIdTest.java 2006-03-14 23:47:37 UTC (rev 9617) @@ -0,0 +1,37 @@ +package org.hibernate.test.abstractembeddedcomponents.cid; + +import org.hibernate.test.TestCase; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * @author Steve Ebersole + */ +public class CompositeIdTest extends TestCase { + public CompositeIdTest(String x) { + super( x ); + } + + protected String[] getMappings() { + return new String[] { "abstractembeddedcomponents/cid/Mappings.hbm.xml" }; + } + + public void testEmbeddedCompositeIdentifierOnAbstractClass() { + MyInterfaceImpl myInterface = new MyInterfaceImpl(); + myInterface.setKey1( "key1" ); + myInterface.setKey2( "key2" ); + myInterface.setName( "test" ); + + Session s = openSession(); + Transaction t = s.beginTransaction(); + s.save( myInterface ); + s.flush(); + + s.createQuery( "from MyInterface" ).list(); + + s.delete( myInterface ); + t.commit(); + s.close(); + + } +} Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml 2006-03-14 23:47:37 UTC (rev 9617) @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!DOCTYPE hibernate-mapping PUBLIC + "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> + +<hibernate-mapping package="org.hibernate.test.abstractembeddedcomponents.cid"> + + <class name="MyInterface" table="MY_INTF" proxy="MyInterface"> + <composite-id> + <key-property name="key1" type="string"/> + <key-property name="key2" type="string"/> + </composite-id> + <discriminator column="TYPE" type="string" length="10"/> + <property name="name" type="string"/> + </class> + + <subclass name="MyInterfaceImpl" extends="MyInterface" discriminator-value="1" proxy="MyInterface"> + </subclass> + +</hibernate-mapping> Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java 2006-03-14 23:47:37 UTC (rev 9617) @@ -0,0 +1,20 @@ +package org.hibernate.test.abstractembeddedcomponents.cid; + +import java.io.Serializable; + +/** + * @author Steve Ebersole + */ +public interface MyInterface extends Serializable { + String getKey1(); + + void setKey1(String key1); + + String getKey2(); + + void setKey2(String key2); + + String getName(); + + void setName(String name); +} Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java 2006-03-14 23:47:37 UTC (rev 9617) @@ -0,0 +1,34 @@ +package org.hibernate.test.abstractembeddedcomponents.cid; + +/** + * @author Steve Ebersole + */ +public class MyInterfaceImpl implements MyInterface { + private String key1; + private String key2; + private String name; + + public String getKey1() { + return key1; + } + + public void setKey1(String key1) { + this.key1 = key1; + } + + public String getKey2() { + return key2; + } + + public void setKey2(String key2) { + this.key2 = key2; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java 2006-03-14 23:47:37 UTC (rev 9617) @@ -0,0 +1,13 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +/** + * @author Steve Ebersole + */ +public interface Address { + public Long getId(); + public void setId(Long id); + public String getAddressType(); + public void setAddressType(String addressType); + public Server getServer(); + public void setServer(Server server); +} Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java 2006-03-14 23:47:37 UTC (rev 9617) @@ -0,0 +1,34 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +/** + * @author Steve Ebersole + */ +public class AddressImpl implements Address { + private Long id; + private String addressType; + private Server server; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAddressType() { + return addressType; + } + + public void setAddressType(String addressType) { + this.addressType = addressType; + } + + public Server getServer() { + return server; + } + + public void setServer(Server server) { + this.server = server; + } +} Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml 2006-03-14 23:47:37 UTC (rev 9617) @@ -0,0 +1,43 @@ +<?xml version="1.0"?> +<!DOCTYPE hibernate-mapping PUBLIC + "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> + +<hibernate-mapping package="org.hibernate.test.abstractembeddedcomponents.propertyref"> + + <class name="Address" table="ADDRESS" proxy="Address"> + <id name="id" type="long" column="ADDRESS_ID"> + <generator class="native"/> + </id> + <discriminator column="ADDRESS_TYPE" type="string" length="30"/> + <properties name="uniqueAddress"> + <property name="addressType" column="ADDRESS_TYPE" type="string" insert="false" update="false" length="30"/> + <many-to-one name="server" column="SERVER_ID" class="Server" not-null="true"/> + </properties> + </class> + + <subclass name="AddressImpl" extends="Address" discriminator-value="2" proxy="Address"> + </subclass> + + <class name="Server" table="SERVER" proxy="Server"> + <id name="id" type="long" column="SERVER_ID"> + <generator class="native"/> + </id> + <discriminator column="SERVER_TYPE" type="string" length="10"/> + <property name="serverType" type="string" column="SERVER_TYPE" length="10" update="false" insert="false"/> + </class> + + <subclass name="ServerImpl" extends="Server" discriminator-value="1" proxy="Server"> + <many-to-one name="address" + class="AddressImpl" + property-ref="uniqueAddress" + cascade="all" + unique="true" + update="false" + insert="false"> + <column name="ADDRESS_TYPE"/> + <column name="SERVER_ID"/> + </many-to-one> + </subclass> + +</hibernate-mapping> Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/PropertyRefTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/PropertyRefTest.java 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/PropertyRefTest.java 2006-03-14 23:47:37 UTC (rev 9617) @@ -0,0 +1,47 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +import org.hibernate.test.TestCase; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * Test of property-refs pointing to abstract embedded components; i.e. + * a mapping properties element (which is internally handled as an embedded + * component) defined on an abstract class or interface which is a target of + * a property-ref mapping. + * + * @author Steve Ebersole + */ +public class PropertyRefTest extends TestCase { + public PropertyRefTest(String x) { + super( x ); + } + + protected String[] getMappings() { + return new String[] { "abstractembeddedcomponents/propertyref/Mappings.hbm.xml" }; + } + + public void testPropertiesRefCascades() { + Session session = openSession(); + Transaction trans = session.beginTransaction(); + ServerImpl server = new ServerImpl(); + session.save( server ); + AddressImpl address = new AddressImpl(); + server.setAddress( address ); + address.setServer( server ); + session.flush(); + session.createQuery( "from Server s join fetch s.address" ).list(); + trans.commit(); + session.close(); + + assertNotNull( server.getId() ); + assertNotNull( address.getId() ); + + session = openSession(); + trans = session.beginTransaction(); + session.delete( address ); + session.delete( server ); + trans.commit(); + session.close(); + } +} Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java 2006-03-14 23:47:37 UTC (rev 9617) @@ -0,0 +1,13 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +/** + * @author Steve Ebersole + */ +public interface Server { + public Long getId(); + public void setId(Long id); + public String getServerType(); + public void setServerType(String serverType); + public Address getAddress(); + public void setAddress(Address address); +} Added: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java 2006-03-14 22:10:43 UTC (rev 9616) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java 2006-03-14 23:47:37 UTC (rev 9617) @@ -0,0 +1,34 @@ +package org.hibernate.test.abstractembeddedcomponents.propertyref; + +/** + * @author Steve Ebersole + */ +public class ServerImpl implements Server { + private Long id; + private String serverType; + private Address address; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getServerType() { + return serverType; + } + + public void setServerType(String serverType) { + this.serverType = serverType; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } +} |
From: <hib...@li...> - 2006-03-14 22:11:18
|
Author: epbernard Date: 2006-03-14 17:10:43 -0500 (Tue, 14 Mar 2006) New Revision: 9616 Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/QueryTest.java Log: add test for distinct and join fetch Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java 2006-03-14 13:35:27 UTC (rev 9615) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java 2006-03-14 22:10:43 UTC (rev 9616) @@ -27,7 +27,7 @@ private String name; private String descr; - private Set<Distributor> distributors; + private Set<Distributor> distributors = new HashSet<Distributor>(); public Item() { } Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/QueryTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/QueryTest.java 2006-03-14 13:35:27 UTC (rev 9615) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/QueryTest.java 2006-03-14 22:10:43 UTC (rev 9616) @@ -6,7 +6,9 @@ import javax.persistence.EntityManager; import javax.persistence.Query; +import org.hibernate.Hibernate; + /** * @author Emmanuel Bernard */ @@ -51,6 +53,15 @@ List result = q.getResultList(); assertNotNull( result ); assertEquals( 2, result.size() ); + + q = em.createQuery( "select item from Item item where item.name in ( ?1 )" ); + params = new ArrayList(); + params.add( item.getName() ); + params.add( item2.getName() ); + q.setParameter( "1", params ); + result = q.getResultList(); + assertNotNull( result ); + assertEquals( 2, result.size() ); em.remove( result.get( 0 ) ); em.remove( result.get( 1 ) ); em.getTransaction().commit(); @@ -195,6 +206,34 @@ em.close(); } + public void testDistinct() throws Exception { + EntityManager em = factory.createEntityManager(); + em.getTransaction().begin(); + em.createQuery( "delete Item").executeUpdate(); + em.createQuery( "delete Distributor").executeUpdate(); + Distributor d1 = new Distributor(); + d1.setName( "Fnac" ); + Distributor d2 = new Distributor(); + d2.setName( "Darty" ); + Item item = new Item( "Mouse", "Micro$oft mouse" ); + item.getDistributors().add( d1 ); + item.getDistributors().add( d2 ); + em.persist( d1 ); + em.persist( d2 ); + em.persist( item ); + em.flush(); + em.clear(); + Query q = em.createQuery( "select distinct i from Item i left join fetch i.distributors"); + item = (Item) q.getSingleResult() + ; + //assertEquals( 1, distinctResult.size() ); + //item = (Item) distinctResult.get( 0 ); + assertTrue( Hibernate.isInitialized( item.getDistributors() ) ); + assertEquals( 2, item.getDistributors().size() ); + em.getTransaction().rollback(); + em.close(); + } + public Class[] getAnnotatedClasses() { return new Class[]{ Item.class, |
From: <hib...@li...> - 2006-03-14 13:35:48
|
Author: epbernard Date: 2006-03-14 08:35:27 -0500 (Tue, 14 Mar 2006) New Revision: 9615 Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java Log: add test Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java 2006-03-14 12:33:18 UTC (rev 9614) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java 2006-03-14 13:35:27 UTC (rev 9615) @@ -7,6 +7,7 @@ import java.util.HashSet; import java.util.Set; import java.util.Date; +import java.util.Iterator; import org.hibernate.Session; import org.hibernate.Transaction; @@ -175,7 +176,7 @@ Employer er = new Employer(); Employee ee = new Employee(); s.persist(ee); - Collection erColl = new ArrayList(); + Set erColl = new HashSet(); Collection eeColl = new ArrayList(); erColl.add(ee); eeColl.add(er); @@ -217,6 +218,66 @@ s.close(); } + public void testRemoveInBetween() throws Exception { + Session s; + Transaction tx; + s = openSession(); + tx = s.beginTransaction(); + Employer er = new Employer(); + Employee ee = new Employee(); + Employee ee2 = new Employee(); + s.persist(ee); + s.persist(ee2); + Set erColl = new HashSet(); + Collection eeColl = new ArrayList(); + erColl.add(ee); + erColl.add(ee2); + eeColl.add(er); + er.setEmployees(erColl); + ee.setEmployers(eeColl); + //s.persist(ee); + tx.commit(); + s.close(); + + s = openSession(); + tx = s.beginTransaction(); + er = (Employer) s.load(Employer.class, er.getId() ); + assertNotNull(er); + assertNotNull( er.getEmployees() ); + assertEquals( 2, er.getEmployees().size() ); + Iterator iterator = er.getEmployees().iterator(); + Employee eeFromDb = (Employee) iterator.next(); + if ( eeFromDb.getId().equals( ee.getId() ) ) { + eeFromDb = (Employee) iterator.next(); + } + assertEquals( ee2.getId(), eeFromDb.getId() ); + er.getEmployees().remove( eeFromDb ); + eeFromDb.getEmployers().remove( er ); + tx.commit(); + s.close(); + + s = openSession(); + tx = s.beginTransaction(); + ee = (Employee) s.get(Employee.class, ee.getId() ); + assertNotNull(ee); + assertFalse("ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) ); + tx.commit(); + assertFalse("ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) ); + s.close(); + + s = openSession(); + tx = s.beginTransaction(); + ee = (Employee) s.get(Employee.class, ee.getId() ); + assertNotNull(ee); + er = ee.getEmployers().iterator().next(); + assertTrue("second join non lazy", Hibernate.isInitialized( er ) ); + assertEquals( 1, er.getEmployees().size() ); + s.delete( er ); + s.delete( ee ); + tx.commit(); + s.close(); + } + public void testSelf() throws Exception { Session s; Transaction tx; |
From: <hib...@li...> - 2006-03-14 12:33:37
|
Author: epbernard Date: 2006-03-14 07:33:18 -0500 (Tue, 14 Mar 2006) New Revision: 9614 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java Log: comments 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-13 22:52:53 UTC (rev 9613) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-03-14 12:33:18 UTC (rev 9614) @@ -178,7 +178,8 @@ } } else if ( property.isCollection() ) { - Class returnedClass = property.getCollectionClass(); + //TODO consider using an XClass + Class returnedClass = property.getCollectionClass(); if ( java.util.Set.class.equals( returnedClass ) ) { return new SetBinder(); } |
From: <hib...@li...> - 2006-03-13 22:53:13
|
Author: epbernard Date: 2006-03-13 17:52:53 -0500 (Mon, 13 Mar 2006) New Revision: 9613 Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/Channel.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/Presenter.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazin.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java Log: ANN-15 ANN-16 Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/Channel.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/Channel.java 2006-03-13 16:20:09 UTC (rev 9612) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/Channel.java 2006-03-13 22:52:53 UTC (rev 9613) @@ -0,0 +1,14 @@ +//$Id: $ +package org.hibernate.test.annotations.cid; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.GeneratedValue; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class Channel { + @Id @GeneratedValue public Integer id; +} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java 2006-03-13 16:20:09 UTC (rev 9612) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java 2006-03-13 22:52:53 UTC (rev 9613) @@ -1,13 +1,14 @@ //$Id$ package org.hibernate.test.annotations.cid; +import java.util.List; +import java.util.Date; + import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.test.annotations.TestCase; -import java.util.List; - /** * test some composite id functionalities * @@ -58,10 +59,46 @@ s.close(); } + public void testManyToOneInCompositeId() throws Exception { + Session s = openSession(); + Transaction tx = s.beginTransaction(); + Channel channel = new Channel(); + s.persist( channel ); + Presenter pres = new Presenter(); + pres.name = "Casimir"; + s.persist( pres ); + TvMagazinPk pk = new TvMagazinPk(); + TvMagazin mag = new TvMagazin(); + mag.time = new Date(); + mag.id = pk; + pk.name = "Trax"; + pk.channel = channel; + pk.presenter = pres; + s.persist( mag ); + tx.commit(); + s.clear(); + tx = s.beginTransaction(); + mag = (TvMagazin) s.createQuery( "from TvMagazin mag where mag.id.name = :name") + .setParameter( "name", "Trax" ).uniqueResult(); + assertNotNull( mag.id ); + assertNotNull( mag.id.channel ); + assertEquals( channel.id, mag.id.channel.id ); + assertNotNull( mag.id.presenter ); + assertEquals( pres.name, mag.id.presenter.name ); + s.delete( mag ); + s.delete( mag.id.channel ); + s.delete( mag.id.presenter ); + tx.commit(); + s.close(); + } + protected Class[] getMappings() { return new Class[] { - Parent.class, - Child.class + Parent.class, + Child.class, + Channel.class, + TvMagazin.class, + Presenter.class }; } } Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/Presenter.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/Presenter.java 2006-03-13 16:20:09 UTC (rev 9612) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/Presenter.java 2006-03-13 22:52:53 UTC (rev 9613) @@ -0,0 +1,13 @@ +//$Id: $ +package org.hibernate.test.annotations.cid; + +import javax.persistence.Entity; +import javax.persistence.Id; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class Presenter { + @Id public String name; +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazin.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazin.java 2006-03-13 16:20:09 UTC (rev 9612) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazin.java 2006-03-13 22:52:53 UTC (rev 9613) @@ -0,0 +1,17 @@ +//$Id: $ +package org.hibernate.test.annotations.cid; + +import java.util.Date; +import javax.persistence.Entity; +import javax.persistence.EmbeddedId; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class TvMagazin { + @EmbeddedId public TvMagazinPk id; + @Temporal(TemporalType.TIME) Date time; +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java 2006-03-13 16:20:09 UTC (rev 9612) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java 2006-03-13 22:52:53 UTC (rev 9613) @@ -0,0 +1,20 @@ +//$Id: $ +package org.hibernate.test.annotations.cid; + +import java.io.Serializable; +import javax.persistence.Embeddable; +import javax.persistence.ManyToOne; +import javax.persistence.JoinColumn; + +/** + * @author Emmanuel Bernard + */ +@Embeddable +public class TvMagazinPk implements Serializable { + @ManyToOne + @JoinColumn(name="chan_id") + public Channel channel; + public String name; + @ManyToOne + public Presenter presenter; +} |
Author: nusco Date: 2006-03-13 11:20:09 -0500 (Mon, 13 Mar 2006) New Revision: 9612 Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/DNA.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/Gene.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/TestCase.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java Log: Accepts unresolved types where a target entity is explicitly set Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -869,14 +869,26 @@ log.debug( "Processing " + propertyHolder.getEntityName() + " " + accessType + " annotation" ); List<XProperty> properties = annotatedClass.getDeclaredProperties(accessType); for ( XProperty p : properties ) { - if( !p.isTypeResolved() ) - throw new IllegalStateException( "Couldn't bind the type for property " + p ); + if( !p.isTypeResolved() && !hasExplicitTargetEntity( p ) ) + throw new IllegalStateException( "Property " + p + " has an unbound type and no explicit target entity."); final boolean currentHasIdentifier = addProperty( p, elements, localPropertyAccessor ); hasIdentifier = hasIdentifier || currentHasIdentifier; } return hasIdentifier; } + private static boolean hasExplicitTargetEntity(XProperty p) { + if( p.isAnnotationPresent( OneToOne.class ) && !p.getAnnotation( OneToOne.class ).targetEntity().equals( void.class ) ) + return true; + if( p.isAnnotationPresent( OneToMany.class ) && !p.getAnnotation( OneToMany.class ).targetEntity().equals( void.class ) ) + return true; + if( p.isAnnotationPresent( ManyToOne.class ) && !p.getAnnotation( ManyToOne.class ).targetEntity().equals( void.class ) ) + return true; + if( p.isAnnotationPresent( ManyToMany.class ) && !p.getAnnotation( ManyToMany.class ).targetEntity().equals( void.class ) ) + return true; + return false; + } + private static boolean addProperty( XProperty property, List<PropertyData> annElts, String propertyAccessor Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -8,6 +8,9 @@ */ public interface XClass extends XAnnotatedElement { + public static final String ACCESS_PROPERTY = "property"; + public static final String ACCESS_FIELD = "field"; + static final Filter DEFAULT_FILTER = new Filter() { public boolean returnStatic() { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -47,7 +47,7 @@ public Type defaultCase(Type t) { throw new IllegalArgumentException( t + " is not an array type" ); } - }.doSwitch( resolve() ); + }.doSwitch( approximate() ); } public XClass getClassOrElementClass() { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -81,9 +81,9 @@ } public List<XProperty> getDeclaredProperties(String accessType, Filter filter) { - if ( accessType.equals( "field" ) ) + if ( accessType.equals( ACCESS_FIELD ) ) return getDeclaredFieldProperties(filter); - if ( accessType.equals( "property" ) ) + if ( accessType.equals( ACCESS_PROPERTY ) ) return getDeclaredMethodProperties(filter); throw new IllegalArgumentException( "Unknown access type " + accessType ); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -42,7 +42,7 @@ } return toXClass( componentType ); } - }.doSwitch( resolve() ); + }.doSwitch( approximate() ); } public XClass getMapKey() { @@ -54,18 +54,18 @@ } return null; } - }.doSwitch( resolve() ); + }.doSwitch( approximate() ); } public XClass getClassOrElementClass() { - return toXClass( resolve() ); + return toXClass( approximate() ); } public Class<? extends Collection> getCollectionClass() { - return TypeUtils.getCollectionClass( resolve() ); + return TypeUtils.getCollectionClass( approximate() ); } public XClass getType() { - return toXClass( resolve() ); + return toXClass( approximate() ); } } \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -36,25 +36,25 @@ private EntityResolver entityResolver; private XMLContext xmlContext; - private static class PropertyKey extends Pair<Member, XClass> { - PropertyKey(Member member, XClass owner) { - super( member, owner ); - } - } - private static class TypeKey extends Pair<Type, TypeEnvironment> { TypeKey(Type t, TypeEnvironment context) { super( t, context ); } } + private static class MemberKey extends Pair<Member, TypeKey> { + MemberKey(Member member, Type owner, TypeEnvironment context) { + super( member, new TypeKey( owner, context ) ); + } + } + private final Map<TypeKey, JavaXClass> xClasses = new HashMap<TypeKey, JavaXClass>(); private final Map<Package, JavaXPackage> packagesToXPackages = new HashMap<Package, JavaXPackage>(); - private final Map<PropertyKey, JavaXProperty> xProperties = new HashMap<PropertyKey, JavaXProperty>(); + private final Map<MemberKey, JavaXProperty> xProperties = new HashMap<MemberKey, JavaXProperty>(); - private final Map<PropertyKey, JavaXMethod> xMethods = new HashMap<PropertyKey, JavaXMethod>(); + private final Map<MemberKey, JavaXMethod> xMethods = new HashMap<MemberKey, JavaXMethod>(); private final TypeEnvironmentFactory typeEnvs = new TypeEnvironmentFactory(); @@ -121,7 +121,7 @@ } XProperty getXProperty(Member member, JavaXClass owner) { - PropertyKey key = new PropertyKey( member, owner ); + MemberKey key = new MemberKey( member, owner.toClass(), owner.getTypeEnvironment() ); JavaXProperty xProperty = xProperties.get( key ); if ( ! xProperties.containsKey( key ) ) { xProperty = JavaXProperty.create( member, owner.getTypeEnvironment(), this ); @@ -131,7 +131,7 @@ } XMethod getXMethod(Member member, JavaXClass owner) { - PropertyKey key = new PropertyKey( member, owner ); + MemberKey key = new MemberKey( member, owner.toClass(), owner.getTypeEnvironment() ); JavaXMethod xMethod = xMethods.get( key ); if ( ! xMethods.containsKey( key ) ) { xMethod = JavaXMethod.create( member, owner.getTypeEnvironment(), this ); @@ -165,9 +165,8 @@ return new JavaXArrayType( propType, context, this ); if ( TypeUtils.isCollection( boundType ) ) return new JavaXCollectionType( propType, context, this ); - if ( TypeUtils.isBase( boundType ) ) + if ( TypeUtils.isSimple( boundType ) ) return new JavaXSimpleType( propType, context, this ); - assert TypeUtils.isVoid( boundType ); throw new IllegalArgumentException( "No PropertyTypeExtractor available for type void "); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -25,7 +25,7 @@ } public XClass getElementClass() { - return toXClass( resolve() ); + return toXClass( approximate() ); } public XClass getClassOrElementClass() { @@ -37,7 +37,7 @@ } public XClass getType() { - return toXClass( resolve() ); + return toXClass( approximate() ); } public XClass getMapKey() { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -16,16 +16,16 @@ */ abstract class JavaXType { - private final Type unboundType; private final TypeEnvironment context; - private final TypeEnvironment approximatingContext; private final JavaXFactory factory; + private final Type approximatedType; + private final Type boundType; protected JavaXType( Type unboundType, TypeEnvironment context, JavaXFactory factory ) { - this.unboundType = unboundType; this.context = context; - this.approximatingContext = factory.toApproximatingEnvironment( context ); this.factory = factory; + this.boundType = context.bind( unboundType ); + this.approximatedType = factory.toApproximatingEnvironment( context ).bind( unboundType ); } abstract public boolean isArray(); @@ -37,11 +37,11 @@ abstract public XClass getType(); public boolean isResolved() { - return TypeUtils.isResolved( context.bind( unboundType ) ); + return TypeUtils.isResolved( boundType ); } - protected Type resolve() { - return approximatingContext.bind( unboundType ); + protected Type approximate() { + return approximatedType; } protected XClass toXClass(Type type) { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -8,21 +8,32 @@ import java.lang.reflect.WildcardType; /** - * A <code>TypeEnvironment</code> that approximates the unresolved components of a <code>Type</code> to their nearest upper binding. + * A <code>TypeEnvironment</code> that approximates the unresolved components of a generic simple + * type or collection to their nearest upper binding. The returned type is always fully resolved. * <p> + * The concept of "type approximation" is not really sound in general. This class just does what we need + * within the Hibernate Annotations environment. It's more or less a hack. The idea is that certain + * types can provide useful information even if they're not fully resolved in the environment. This class + * tries to turn those types into the nearest fully resolved type that still carries that information. + * <p> * For example:<br> * <code>T</code> becomes <code>Object</code>.<br> - * Array of <code>? extends Foo</code> becomes array of <code>Foo</code>.<br> + * <code>T extends Foo</code> becomes <code>Foo</code>.<br> * <code>List<T></code> becomes <code>List<Object></code>.<br> - * <code>List<T extends Foo></code> becomes <code>List<Foo></code>.<p> + * <code>List<T extends Foo></code> becomes <code>List<Foo></code>.<br> + * An array of <code>T extends Foo</code> becomes an array of <code>Foo</code>.<p> * - * If a wildcard or type variable has multiple upper bounds, it will be approximated to Object. - * Information on lower bounds is discarded during approximation.<p> + * If a type variable has multiple upper bounds, it will be approximated to <code>Object</code>. + * Lower bounds are ignored.<p> * - * An generic array is always approximated to an array of <code>Object</code>s. Example:<br> - * <code>List<T>[]</code> becomes <code>Object[]</code>. This is sub-optimal, but a finer - * approximations has implementation problems. + * Wildcards are generally not approximated. <code>Class<?></code> stays <code>Class<?></code>. + * A wildcard within a generic type is approximated to its upper binding. <code>List<?></code> becomes + * <code>List<Object></code><p> * + * Note that <code>Class<T></code> is <emp>not</emp> approximated <code>Class<Object></code>. + * That would be wrong in any situation. All parametric types that are not type variables, collections or + * arrays are coarsely approximated to <code>Object.class</code>. + * * @return a type where the generic arguments have been replaced by raw classes. * * @author Paolo Perrotta @@ -30,9 +41,15 @@ class ApproximatingTypeEnvironment implements TypeEnvironment { public Type bind(final Type type) { - Type result = new TypeSwitch<Type>() { + Type result = fineApproximation( type ); + assert TypeUtils.isResolved( result ); + return result; + } + + private Type fineApproximation(final Type type) { + return new TypeSwitch<Type>() { public Type caseWildcardType(WildcardType wildcardType) { - return collapseToUpperBound( wildcardType.getUpperBounds() ); + return wildcardType; } @Override @@ -46,36 +63,73 @@ return genericArrayType; Type componentType = genericArrayType.getGenericComponentType(); Type boundComponentType = bind( componentType ); - if( !( boundComponentType instanceof Class) ) - return Object[].class; // this is because I found no standard way to instance arrays of a generic type - return Array.newInstance( (Class)boundComponentType, 0 ).getClass(); + if( boundComponentType instanceof Class ) + return Array.newInstance( (Class)boundComponentType, 0 ).getClass(); + // fall back to coarse approximation, because I found no standard way + // to instance arrays of a generic type + return Object[].class; } @Override public Type caseParameterizedType(ParameterizedType parameterizedType) { if( TypeUtils.isResolved( parameterizedType ) ) return parameterizedType; + + if( !TypeUtils.isCollection( parameterizedType ) ) + return Object.class; // fall back to coarse approximation + Type[] typeArguments = parameterizedType.getActualTypeArguments(); - Type[] boundTypeArguments = new Type[typeArguments.length]; + Type[] approximatedTypeArguments = new Type[typeArguments.length]; for(int i = 0; i < typeArguments.length; i++) - boundTypeArguments[i] = bind( typeArguments[i] ); - return TypeFactory.createParameterizedType( bind( parameterizedType.getRawType() ), boundTypeArguments, parameterizedType.getOwnerType() ); + approximatedTypeArguments[i] = coarseApproximation( typeArguments[i] ); + + return TypeFactory.createParameterizedType( + bind( parameterizedType.getRawType() ), + approximatedTypeArguments, + parameterizedType.getOwnerType() ); } @Override - public Type caseTypeVariable(TypeVariable typeVariable) { - return collapseToUpperBound( typeVariable.getBounds() ); + public Type defaultCase(Type t) { + return coarseApproximation( t ); } + }.doSwitch( type ); + } + + public Type coarseApproximation(final Type type) { + Type result = new TypeSwitch<Type>() { + public Type caseWildcardType(WildcardType wildcardType) { + return approximateTo( wildcardType.getUpperBounds() ); + } - private Type collapseToUpperBound(Type[] upperBounds) { - if( upperBounds.length != 1 ) - return Object.class; // we can't do much about multiple upper bounds - return bind( upperBounds[0] ); + @Override + public Type caseGenericArrayType(GenericArrayType genericArrayType) { + if( TypeUtils.isResolved( genericArrayType ) ) + return genericArrayType; + return Object[].class; } @Override + public Type caseParameterizedType(ParameterizedType parameterizedType) { + if( TypeUtils.isResolved( parameterizedType ) ) + return parameterizedType; + return Object.class; + } + + @Override + public Type caseTypeVariable(TypeVariable typeVariable) { + return approximateTo( typeVariable.getBounds() ); + } + + private Type approximateTo(Type[] bounds) { + if( bounds.length != 1 ) + return Object.class; + return coarseApproximation( bounds[0] ); + } + + @Override public Type defaultCase(Type t) { - throw new IllegalArgumentException( "Unknown subclass of Type: " + t.getClass() ); + return t; } }.doSwitch( type ); assert TypeUtils.isResolved( result ); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -24,16 +24,34 @@ @Override public Type caseGenericArrayType(GenericArrayType genericArrayType) { - Type componentType = bind( genericArrayType.getGenericComponentType() ); - return TypeFactory.createArrayType( componentType ); + Type originalComponentType = genericArrayType.getGenericComponentType(); + Type boundComponentType = bind( originalComponentType ); + // try to keep the original type if possible + if( originalComponentType == boundComponentType ) + return genericArrayType; + return TypeFactory.createArrayType( boundComponentType ); } @Override public Type caseParameterizedType(ParameterizedType parameterizedType) { - return TypeFactory.createParameterizedType( parameterizedType.getRawType(), substitute( parameterizedType - .getActualTypeArguments() ), parameterizedType.getOwnerType() ); + Type[] originalArguments = parameterizedType.getActualTypeArguments(); + Type[] boundArguments = substitute( originalArguments ); + // try to keep the original type if possible + if( areSame( originalArguments, boundArguments ) ) + return parameterizedType; + return TypeFactory.createParameterizedType( parameterizedType.getRawType(), boundArguments, parameterizedType.getOwnerType() ); } + private boolean areSame(Object[] array1, Object[] array2) { + if( array1.length != array2.length ) + return false; + for ( int i = 0; i < array1.length; i++ ) { + if( array1[i] != array2[i] ) + return false; + } + return true; + } + @Override public Type caseTypeVariable(TypeVariable typeVariable) { int idx = indexOf( formalArguments, typeVariable ); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -40,11 +40,18 @@ @Override public Boolean caseWildcardType(WildcardType wildcardType) { - return false; + return areResolved( wildcardType.getUpperBounds() ) && areResolved( wildcardType.getLowerBounds() ); } }.doSwitch( t ); } + private static Boolean areResolved(Type[] types) { + for( Type t : types ) + if( !isResolved( t ) ) + return false; + return true; + } + public static Class<? extends Collection> getCollectionClass(Type type) { return new TypeSwitch<Class<? extends Collection>>() { @Override @@ -54,14 +61,16 @@ @Override public Class<? extends Collection> caseParameterizedType(ParameterizedType parameterizedType) { - Class rawType = (Class) parameterizedType.getRawType(); - for ( Type actualTypeArgument : parameterizedType.getActualTypeArguments() ) { - if ( !isBase( actualTypeArgument ) ) { - return null; - } - } - return getCollectionClass( rawType ); + return getCollectionClass( (Class) parameterizedType.getRawType() ); } + + @Override + public Class<? extends Collection> caseWildcardType(WildcardType wildcardType) { + Type[] upperBounds = wildcardType.getUpperBounds(); + if( upperBounds.length == 0 ) + return null; + return getCollectionClass( upperBounds[0] ); + } @Override public Class<? extends Collection> defaultCase(Type t) { @@ -79,7 +88,7 @@ || clazz == java.util.SortedMap.class; // extension to the specs } - public static boolean isBase(Type type) { + public static boolean isSimple(Type type) { return new TypeSwitch<Boolean>() { @Override public Boolean caseClass(Class clazz) { @@ -90,7 +99,7 @@ @Override public Boolean caseParameterizedType(ParameterizedType parameterizedType) { for ( Type actualTypeArgument : parameterizedType.getActualTypeArguments() ) { - if ( !isBase( actualTypeArgument ) ) { + if ( !isSimple( actualTypeArgument ) ) { return false; } } @@ -98,12 +107,24 @@ } @Override + public Boolean caseWildcardType(WildcardType wildcardType) { + return areSimple( wildcardType.getUpperBounds() ) && areSimple( wildcardType.getLowerBounds() ); + } + + @Override public Boolean defaultCase(Type t) { return false; } }.doSwitch( type ); } + private static Boolean areSimple(Type[] types) { + for( Type t : types ) + if( !isSimple( t ) ) + return false; + return true; + } + public static boolean isVoid(Type type) { return void.class.equals( type ); } @@ -117,7 +138,7 @@ @Override public Boolean caseGenericArrayType(GenericArrayType genericArrayType) { - return isBase( genericArrayType.getGenericComponentType() ); + return isSimple( genericArrayType.getGenericComponentType() ); } @Override Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -161,7 +161,6 @@ if ( beanValidator != null ) beanValidators.add( beanValidator ); } } - ; //Check on all selected classes for ( XClass currClass : classes ) { @@ -183,9 +182,6 @@ } ); for ( XProperty field : fields ) { - if ( !field.isTypeResolved() ) { - throw new IllegalStateException( "Couldn't bind the type of property field " + field ); - } createMemberValidator( field ); createChildValidator( resourceBundle, field ); } @@ -221,6 +217,8 @@ } private void createMemberValidator(XMember member) { + if( !member.isTypeResolved() ) + log.warn( "Original type of property " + member + " is unbound and has been approximated."); Annotation[] memberAnnotations = member.getAnnotations(); for ( int j = 0; j < memberAnnotations.length ; j++ ) { Annotation methodAnnotation = memberAnnotations[j]; Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/TestCase.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/TestCase.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/TestCase.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -25,7 +25,7 @@ super(x); } - private void buildSessionFactory(Class[] classes, String[] packages) throws Exception { + protected void buildSessionFactory(Class[] classes, String[] packages) throws Exception { if ( getSessions()!=null ) getSessions().close(); try { Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/DNA.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/DNA.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/DNA.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -0,0 +1,24 @@ +//$Id: Address.java 8967 2006-01-03 12:27:34Z epbernard $ +package org.hibernate.test.annotations.generics; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +/** + * @author Paolo Perrotta + */ +@Entity +public class DNA { + + private Integer id; + + @Id @GeneratedValue + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/Gene.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/Gene.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/Gene.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -0,0 +1,29 @@ +package org.hibernate.test.annotations.generics; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +/** + * @author Paolo Perrotta + */ +@Entity +public class Gene<T> { + + private Integer id; + + @Id @GeneratedValue + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + @ManyToOne(targetEntity=DNA.class) + public T getGeneticCode() { return null; } + + public void setGeneticCode(T gene) {} +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -0,0 +1,28 @@ +package org.hibernate.test.annotations.generics; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.test.annotations.TestCase; + +/** + * @author Paolo Perrotta + */ +public class UnresolvedTypeTest extends TestCase { + + public void testAcceptsUnresolvedPropertyTypesIfATargetEntityIsExplicitlySet() { + Session s = openSession(); + Transaction tx = s.beginTransaction(); + Gene item = new Gene(); + s.persist( item ); + tx.commit(); + s.close(); + } + + @Override + protected Class[] getMappings() { + return new Class[] { + Gene.class, + DNA.class + }; + } +} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -18,68 +18,61 @@ */ public class JavaXClassTest extends XAnnotatedElementTestCase { - XClass clazz; + XClass fatherAsSeenFromSon = ReflectionManager.INSTANCE.toXClass( Son.class ).getSuperclass(); + XClass grandpa = ReflectionManager.INSTANCE.toXClass( Grandpa.class ); - XClass fatherClazz = ReflectionManager.INSTANCE.toXClass( Grandpa.class ); - - @Override - protected void setUp() { - clazz = ReflectionManager.INSTANCE.toXClass( Son.class ).getSuperclass(); - } - - public void testHasAnOwnerClass() { - // The "owner" is the "point of view" through which we see a class. + public void testHasAPointOfViewClass() { // Since Dad is an Entity, getting it through Son.getSuperclass() gives - // us a view of Dad with Son as an owner. + // us a view of properties from Dad with Son as a point of view. XClass sameView = ReflectionManager.INSTANCE.toXClass( Son.class ).getSuperclass(); XClass differentView = ReflectionManager.INSTANCE.toXClass( Dad.class ); - assertSame( "Should be the same instance: same owner", sameView, clazz ); - assertNotSame( "Should be a different instance: different owner", differentView, clazz ); + assertSame( "Should be the same instance: same owner", sameView, fatherAsSeenFromSon ); + assertNotSame( "Should be a different instance: different owner", differentView, fatherAsSeenFromSon ); assertEquals( ".equals() should show equality", sameView, differentView ); } public void testHasAName() { - assertSame( "org.hibernate.test.reflection.java.generics.Dad", clazz.getName() ); + assertSame( "org.hibernate.test.reflection.java.generics.Dad", fatherAsSeenFromSon.getName() ); } public void testHasASuperclass() { - assertEquals( fatherClazz, clazz.getSuperclass() ); + assertEquals( grandpa, fatherAsSeenFromSon.getSuperclass() ); } public void testHasInterfaces() { - XClass[] interfaces = clazz.getSuperclass().getInterfaces(); + XClass[] interfaces = fatherAsSeenFromSon.getSuperclass().getInterfaces(); assertEquals( 2, interfaces.length ); assertTrue( ReflectionManager.INSTANCE.equals( interfaces[0], Serializable.class) ); assertTrue( ReflectionManager.INSTANCE.equals( interfaces[1], Language.class) ); } public void testCanBeAssignableFromAnotherXClass() { - assertFalse( clazz.isAssignableFrom( fatherClazz ) ); - assertTrue( fatherClazz.isAssignableFrom( clazz ) ); + assertFalse( fatherAsSeenFromSon.isAssignableFrom( grandpa ) ); + assertTrue( grandpa.isAssignableFrom( fatherAsSeenFromSon ) ); } public void testExtractsPublicFieldsAsProperties() { - List<XProperty> fieldProperties = clazz.getDeclaredProperties( "field" ); + List<XProperty> fieldProperties = fatherAsSeenFromSon.getDeclaredProperties( "field" ); assertEquals( 1, fieldProperties.size() ); } public void testExtractsPublicMethodsAsProperties() { - List<XProperty> methodProperties = clazz.getDeclaredProperties( "property" ); + List<XProperty> methodProperties = fatherAsSeenFromSon.getDeclaredProperties( "property" ); assertEquals( 7, methodProperties.size() ); } public void testCanBeAbstract() { - assertFalse( clazz.isAbstract() ); + assertFalse( fatherAsSeenFromSon.isAbstract() ); assertTrue( ReflectionManager.INSTANCE.toXClass( Grandpa.class ).isAbstract() ); } public void testCanBeAPrimitive() { - assertFalse( clazz.isPrimitive() ); + assertFalse( fatherAsSeenFromSon.isPrimitive() ); assertTrue( ReflectionManager.INSTANCE.toXClass( int.class ).isPrimitive() ); } public void testCanBeAnEnum() { - assertFalse( clazz.isEnum() ); + assertFalse( fatherAsSeenFromSon.isEnum() ); assertTrue( ReflectionManager.INSTANCE.toXClass( CacheModeType.class ).isEnum() ); } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -2,6 +2,7 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.Collection; import java.util.Map; import junit.framework.TestCase; @@ -22,37 +23,49 @@ assertEquals( String[].class, approximatingUnboundContext.bind( String[].class ) ); } + public void testDoesNothingOnWildcards() throws Exception { + Type type = BigBlob.class.getMethod( "genericClass", new Class[0] ).getGenericReturnType(); + Type approxType = approximatingBoundContext.bind( type ); + assertEquals( "java.lang.Class<?>", approxType.toString() ); + } + public void testDoesNothingOnParameterizedTypesThatAreAlreadyFullyBound() throws Exception { - Type type = BigBlob.class.getMethod( "genTypeWithoutWildcards", new Class[0] ).getGenericReturnType(); + Type type = BigBlob.class.getMethod( "simpleGenericType", new Class[0] ).getGenericReturnType(); assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) ); } + public void testDoesNothingOnComplexParameterizedTypesThatAreNotCollections() throws Exception { + Type type = BigBlob.class.getMethod( "genericType", new Class[0] ).getGenericReturnType(); + assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) ); + } + public void testDoesNothingOnGenericArraysThatAreAlreadyFullyBound() throws Exception { - Type type = BigBlob.class.getMethod( "genArrayType", new Class[0] ).getGenericReturnType(); + Type type = BigBlob.class.getMethod( "array", new Class[0] ).getGenericReturnType(); assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) ); } - public void testApproximatesUnboundGenericArraysToArraysOfObjects() throws Exception { - Type type = BigBlob.class.getMethod( "genArrayType", new Class[0] ).getGenericReturnType(); + public void testApproximatesSimpleGenericTypesToTheirUpperBound() throws Exception { + Type type = BigBlob.class.getMethod( "simpleGenericType", new Class[0] ).getGenericReturnType(); + assertEquals( "java.util.List<java.lang.String>", approximatingBoundContext.bind( type ).toString() ); + } + + public void testApproximatesGenericsInArraysToTheirUpperBounds() throws Exception { + Type type = BigBlob.class.getMethod( "array", new Class[0] ).getGenericReturnType(); + assertEquals( Collection[].class, approximatingUnboundContext.bind( type ) ); + } + + public void testApproximatesArraysOfComplexTypesToArraysOfObjects() throws Exception { + Type type = BigBlob.class.getMethod( "complexGenericArray", new Class[0] ).getGenericReturnType(); assertEquals( Object[].class, approximatingUnboundContext.bind( type ) ); } - public void testApproximatesWildcardsToTheirUpperBound() throws Exception { - Type type = BigBlob.class.getMethod( "genTypeContainingWildcardsWithUpperBounds", new Class[0] ).getGenericReturnType(); + public void testApproximatesGenericsAndWildcardsInCollectionsToTheirUpperBounds() throws Exception { + Type type = BigBlob.class.getMethod( "genericCollection", new Class[0] ).getGenericReturnType(); ParameterizedType approxType = (ParameterizedType)approximatingUnboundContext.bind( type ); assertEquals( Map.class, approxType.getRawType() ); assertNull( approxType.getOwnerType() ); assertEquals( 2, approxType.getActualTypeArguments().length ); assertEquals( Object.class, approxType.getActualTypeArguments()[0] ); - assertEquals( Comparable.class, approxType.getActualTypeArguments()[1] ); + assertEquals( Collection.class, approxType.getActualTypeArguments()[1] ); } - - public void testApproximatesWildcardsWithoutUpperBoundsToObject() throws Exception { - Type type = BigBlob.class.getMethod( "genTypeContainingWildcardsWithoutUpperBounds", new Class[0] ).getGenericReturnType(); - ParameterizedType approxType = (ParameterizedType)approximatingUnboundContext.bind( type ); - assertEquals( Class.class, approxType.getRawType() ); - assertNull( approxType.getOwnerType() ); - assertEquals( 1, approxType.getActualTypeArguments().length ); - assertEquals( Object.class, approxType.getActualTypeArguments()[0] ); - } } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java 2006-03-13 13:12:35 UTC (rev 9611) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java 2006-03-13 16:20:09 UTC (rev 9612) @@ -1,15 +1,20 @@ package org.hibernate.test.reflection.java.generics; +import java.util.Collection; import java.util.List; import java.util.Map; -public class BigBlob<T, E> { +public class BigBlob<T, E extends Collection> { - public List<T> genTypeWithoutWildcards() { return null; } + public E simpleGenericType() { return null; } - public Map<T, ? extends Comparable> genTypeContainingWildcardsWithUpperBounds() { return null; } + public Class<?> genericClass() { return null; } - public Class<?> genTypeContainingWildcardsWithoutUpperBounds() { return null; } + public Class<T> genericType() { return null; } - public List<T>[] genArrayType() { return null; } + public Map<T, ? extends E> genericCollection() { return null; } + + public E[] array() { return null; } + + public List<? extends T>[] complexGenericArray() { return null; } } |
From: <hib...@li...> - 2006-03-12 21:48:33
|
Author: epbernard Date: 2006-03-12 16:48:15 -0500 (Sun, 12 Mar 2006) New Revision: 9610 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java Log: minor Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-03-12 21:45:27 UTC (rev 9609) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-03-12 21:48:15 UTC (rev 9610) @@ -50,6 +50,7 @@ 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 String VALIDATOR_MESSAGE = "ValidatorMessages"; private static final Set<Class> INDEXABLE_CLASS = new HashSet<Class>(); static { @@ -108,20 +109,20 @@ //use context class loader as a first citizen ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); if ( contextClassLoader == null ) { - throw new MissingResourceException( "No context classloader", null, "ValidatorMessage" ); + throw new MissingResourceException( "No context classloader", null, VALIDATOR_MESSAGE ); } rb = ResourceBundle.getBundle( - "ValidatorMessages", + VALIDATOR_MESSAGE, Locale.getDefault(), contextClassLoader ); } catch (MissingResourceException e) { - log.trace( "ResourceBundle ValidatorMessages not found in thread context classloader" ); + log.trace( "ResourceBundle " + VALIDATOR_MESSAGE + " not found in thread context classloader" ); //then use the Validator Framework classloader try { rb = ResourceBundle.getBundle( - "ValidatorMessages", + VALIDATOR_MESSAGE, Locale.getDefault(), this.getClass().getClassLoader() ); |
From: <hib...@li...> - 2006-03-12 21:46:52
|
Author: epbernard Date: 2006-03-12 16:45:27 -0500 (Sun, 12 Mar 2006) New Revision: 9609 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/Table.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/entity/Forest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Cat.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/Vehicule.java Log: ANN-262 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/Table.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/Table.java 2006-03-12 18:03:57 UTC (rev 9608) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/Table.java 2006-03-12 21:45:27 UTC (rev 9609) @@ -16,7 +16,7 @@ /** * name of the targeted table */ - String name(); + String appliesTo(); /** * Indexes Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2006-03-12 18:03:57 UTC (rev 9608) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2006-03-12 21:45:27 UTC (rev 9609) @@ -527,7 +527,7 @@ public void addIndexes(org.hibernate.annotations.Table table) { if ( table == null ) return; - String tableName = table.name(); + String tableName = table.appliesTo(); Iterator tables = persistentClass.getTableClosureIterator(); Table hibTable = null; while ( tables.hasNext() ) { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/entity/Forest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/entity/Forest.java 2006-03-12 18:03:57 UTC (rev 9608) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/entity/Forest.java 2006-03-12 21:45:27 UTC (rev 9609) @@ -35,7 +35,7 @@ @Filter(name="betweenLength"), @Filter(name="minLength", condition=":minLength <= length") } ) -...@or...notations.Table(name="Forest", indexes = { @Index(name="idx", columnNames = { "name", "length" } ) } ) +...@or...notations.Table(appliesTo="Forest", indexes = { @Index(name="idx", columnNames = { "name", "length" } ) } ) public class Forest { private Integer id; private String name; Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Cat.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Cat.java 2006-03-12 18:03:57 UTC (rev 9608) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Cat.java 2006-03-12 21:45:27 UTC (rev 9609) @@ -21,7 +21,7 @@ @SecondaryTable(name="`Cat nbr1`"), @SecondaryTable(name="Cat2", uniqueConstraints={@UniqueConstraint(columnNames={"storyPart2"})}) }) -@Table(name="Cat", indexes = @Index(name="secondname", columnNames="secondName")) +@Table(appliesTo="Cat", indexes = @Index(name="secondname", columnNames="secondName")) public class Cat implements Serializable { private Integer id; 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-12 18:03:57 UTC (rev 9608) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/various/Vehicule.java 2006-03-12 21:45:27 UTC (rev 9609) @@ -18,7 +18,7 @@ */ @Entity @Inheritance(strategy = InheritanceType.JOINED) -...@or...notations.Table(name="Vehicule", +...@or...notations.Table(appliesTo="Vehicule", indexes = { @Index(name="improbableindex", columnNames={"registration", "Conductor_fk"} ), @Index(name="secondone", columnNames={"Conductor_fk"} ) |